1
2
3
4
5
6
7
8
9
10
11 package org.mule.impl;
12
13 import org.mule.config.MuleProperties;
14 import org.mule.config.i18n.CoreMessages;
15 import org.mule.transformers.codec.Base64Decoder;
16 import org.mule.transformers.codec.Base64Encoder;
17 import org.mule.umo.UMOException;
18 import org.mule.umo.UMOMessage;
19 import org.mule.umo.UMOSession;
20 import org.mule.umo.provider.UMOSessionHandler;
21 import org.mule.umo.transformer.UMOTransformer;
22
23 import java.io.UnsupportedEncodingException;
24 import java.util.Iterator;
25 import java.util.StringTokenizer;
26
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29
30
31
32
33
34
35
36
37
38 public class MuleSessionHandler implements UMOSessionHandler
39 {
40
41
42
43
44 protected transient Log logger = LogFactory.getLog(getClass());
45
46 private static UMOTransformer encoder = new Base64Encoder();
47 private static UMOTransformer decoder = new Base64Decoder();
48
49 public void retrieveSessionInfoFromMessage(UMOMessage message, UMOSession session) throws UMOException
50 {
51 String sessionId = (String) message.removeProperty(MuleProperties.MULE_SESSION_ID_PROPERTY);
52 Object sessionHeader = message.removeProperty(MuleProperties.MULE_SESSION_PROPERTY);
53
54 if (sessionId != null)
55 {
56
57 throw new IllegalStateException(
58 "This session handler does not know how to look up session information for session id: "
59 + sessionId);
60 }
61 if (sessionHeader != null)
62 {
63 String sessionString = null;
64 try
65 {
66 sessionString = new String((byte[]) decoder.transform(sessionHeader), message.getEncoding());
67 }
68 catch (UnsupportedEncodingException e)
69 {
70 sessionString = new String((byte[]) decoder.transform(sessionHeader));
71 }
72 if (logger.isDebugEnabled())
73 {
74 logger.debug("Parsing session header: " + sessionString);
75 }
76 String pair;
77 String name;
78 String value;
79 for (StringTokenizer stringTokenizer = new StringTokenizer(sessionString, ";"); stringTokenizer.hasMoreTokens();)
80 {
81 pair = stringTokenizer.nextToken();
82 int i = pair.indexOf("=");
83 if (i == -1)
84 {
85 throw new IllegalArgumentException(
86 CoreMessages.sessionValueIsMalformed(pair).toString());
87 }
88 name = pair.substring(0, i).trim();
89 value = pair.substring(i + 1).trim();
90 session.setProperty(name, value);
91 if (logger.isDebugEnabled())
92 {
93 logger.debug("Added Session variable: " + pair);
94 }
95 }
96
97 }
98 }
99
100 public void storeSessionInfoToMessage(UMOSession session, UMOMessage message) throws UMOException
101 {
102 StringBuffer buf = new StringBuffer();
103 buf.append(getSessionIDKey()).append("=").append(session.getId());
104 for (Iterator iterator = session.getPropertyNames(); iterator.hasNext();)
105 {
106 Object o = iterator.next();
107 buf.append(";");
108 buf.append(o).append("=").append(session.getProperty(o));
109 if (logger.isDebugEnabled())
110 {
111 logger.debug("Adding property to session header: " + o + "=" + session.getProperty(o));
112 }
113 }
114 String sessionString = buf.toString();
115 if (logger.isDebugEnabled())
116 {
117 logger.debug("Adding session header to message: " + sessionString);
118 }
119 sessionString = (String) encoder.transform(sessionString);
120 message.setProperty(MuleProperties.MULE_SESSION_PROPERTY, sessionString);
121 }
122
123 public String getSessionIDKey()
124 {
125 return "ID";
126 }
127 }