All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.wings.jsp.WingsSession Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2005 Your Corporation. All Rights Reserved.
 */
package org.wings.jsp;

import org.wings.Renderable;
import org.wings.RequestURL;
import org.wings.SComponent;
import org.wings.SForm;
import org.wings.SFrame;
import org.wings.event.SRequestEvent;
import org.wings.event.SRequestListener;
import org.wings.externalizer.ExternalizedResource;
import org.wings.io.StringBuilderDevice;
import org.wings.plaf.css.Utils;
import org.wings.resource.ResourceNotFoundException;
import org.wings.session.Session;
import org.wings.session.SessionManager;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

/**
 * @author hengels
 */
public class WingsSession
        extends Session
{
    public static WingsSession getSession(HttpServletRequest request, HttpServletResponse response) throws ServletException {
        synchronized (request.getSession()) {
            String key = "Session:" + request.getSession().getServletContext().getServletContextName();
            WingsSession wingsSession = (WingsSession)request.getSession().getAttribute(key);
            if (wingsSession == null) {
                wingsSession = new WingsSession();
                request.getSession().setAttribute(key, wingsSession);
                SessionManager.setSession(wingsSession);

                wingsSession.init(request);
                RequestURL requestURL = new RequestURL("", response.encodeURL("foo").substring(3));
                wingsSession.setProperty("request.url", requestURL);
            }

            SessionManager.setSession(wingsSession);
            wingsSession.setServletRequest(request);
            wingsSession.setServletResponse(response);

            return wingsSession;
        }
    }

    public static void removeSession() {
        SessionManager.removeSession();
    }

    public static SFrame getFrame(WingsSession wingsSession) {
        String path = wingsSession.getServletRequest().getServletPath();
        int pos = path.lastIndexOf('/');
        path = path.substring(pos + 1);

        synchronized (wingsSession.getServletRequest().getSession()) {
            Map frames = getFrames(wingsSession);
            SFrame frame = (SFrame)frames.get(path);
            if (frame == null) {
                frame = new SFrame(path);
                frame.setTargetResource(path);
                frame.show();
                frames.put(path, frame);
            }
            return frame;
        }
    }

    private static Map getFrames(WingsSession wingsSession) {
        Map frames = (Map) wingsSession.getProperty("frames");
        if (frames == null) {
            frames = new HashMap();
            wingsSession.setProperty("frames", frames);
        }
        return frames;
    }

    public static void dispatchEvents(HttpServletRequest request, HttpServletResponse response) throws ServletException {
        synchronized (request.getSession()) {
            WingsSession wingsSession = getSession(request, response);
            try {
                SForm.clearArmedComponents();

                Enumeration en = request.getParameterNames();
                if (en.hasMoreElements()) {
                    wingsSession.fireRequestEvent(SRequestEvent.DISPATCH_START);

                    while (en.hasMoreElements()) {
                        String paramName = (String) en.nextElement();
                        String[] value = request.getParameterValues(paramName);
                        wingsSession.getDispatcher().dispatch(paramName, value);
                    }
                    SForm.fireEvents();

                    wingsSession.fireRequestEvent(SRequestEvent.DISPATCH_DONE);
                }

                wingsSession.getReloadManager().invalidateFrames();
            }
            finally {
                wingsSession.getReloadManager().clear();
                SessionManager.removeSession();
                SForm.clearArmedComponents();
            }
        }
    }

    public void addComponent(String name, SComponent component) throws ServletException {
        SFrame frame = getFrame(this);
        frame.getContentPane().add(component, name);
        setProperty(name, component);
    }

    public SComponent getComponent(String name) {
        return (SComponent)getProperty(name);
    }

    public SComponent removeComponent(String name) throws ServletException {
        SFrame frame = getFrame(this);
        SComponent component = (SComponent) removeProperty(name);
        frame.getContentPane().remove(component);
        return component;
    }

    public static void writeHeaders(HttpServletRequest request, HttpServletResponse response, JspWriter out)
            throws IOException, ServletException, ResourceNotFoundException {
        synchronized (request.getSession()) {
            WingsSession wingsSession = getSession(request, response);
            SFrame frame = getFrame(wingsSession);

            StringBuilderDevice headerdev = new StringBuilderDevice(1024);
            for (Object next : frame.getHeaders()) {
                if (next instanceof Renderable) {
                    ((Renderable) next).write(headerdev);
                } else {
                    Utils.write(headerdev, next.toString());
                }
                headerdev.write("\n".getBytes());
            }
            out.print(headerdev);

            SessionManager.removeSession();
        }
    }

    public static void writeComponent(HttpServletRequest request, HttpServletResponse response, JspWriter out, SComponent component) throws IOException {
        synchronized (request.getSession()) {
            StringBuilderDevice outdev = new StringBuilderDevice(1024);
            component.write(outdev);
            out.print(outdev);
            SessionManager.removeSession();
        }
    }

    public void setServletRequest(HttpServletRequest servletRequest) {
        this.servletRequest = servletRequest;
    }

    public void setServletResponse(HttpServletResponse servletResponse) {
        this.servletResponse = servletResponse;
    }

    public void fireRequestEvent(int type) {
        fireRequestEvent(type, null);
    }

    public void fireRequestEvent(int type, ExternalizedResource resource) {
        SRequestEvent event = null;

        Object[] listeners = listenerList.getListenerList();
        for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == SRequestListener.class) {
                // Lazily create the event:
                if (event == null) {
                    event = new SRequestEvent(this, type, resource);
                }
                ((SRequestListener) listeners[i + 1]).processRequest(event);
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy