1
2
3
4
5
6
7
8
9
10
11 package org.mule;
12
13 import org.mule.api.MuleException;
14 import org.mule.api.MuleMessage;
15 import org.mule.api.MuleSession;
16 import org.mule.api.config.MuleProperties;
17 import org.mule.api.transformer.Transformer;
18 import org.mule.api.transport.SessionHandler;
19 import org.mule.config.i18n.CoreMessages;
20 import org.mule.transformer.codec.Base64Decoder;
21 import org.mule.transformer.codec.Base64Encoder;
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 SessionHandler
39 {
40
41
42
43
44 protected transient Log logger = LogFactory.getLog(getClass());
45
46 private static Transformer encoder = new Base64Encoder();
47 private static Transformer decoder = new Base64Decoder();
48
49 public void retrieveSessionInfoFromMessage(MuleMessage message, MuleSession session) throws MuleException
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 throw new IllegalStateException(
57 "This session handler does not know how to look up session information for session id: "
58 + sessionId);
59 }
60 if (sessionHeader != null)
61 {
62 String sessionString = null;
63 try
64 {
65 sessionString = new String((byte[]) decoder.transform(sessionHeader), message.getEncoding());
66 }
67 catch (UnsupportedEncodingException e)
68 {
69 sessionString = new String((byte[]) decoder.transform(sessionHeader));
70 }
71 if (logger.isDebugEnabled())
72 {
73 logger.debug("Parsing session header: " + sessionString);
74 }
75 String pair;
76 String name;
77 String value;
78 for (StringTokenizer stringTokenizer = new StringTokenizer(sessionString, ";"); stringTokenizer.hasMoreTokens();)
79 {
80 pair = stringTokenizer.nextToken();
81 int i = pair.indexOf("=");
82 if (i == -1)
83 {
84 throw new IllegalArgumentException(
85 CoreMessages.sessionValueIsMalformed(pair).toString());
86 }
87 name = pair.substring(0, i).trim();
88 value = pair.substring(i + 1).trim();
89 session.setProperty(name, value);
90 if (logger.isDebugEnabled())
91 {
92 logger.debug("Added MuleSession variable: " + pair);
93 }
94 }
95
96 }
97 }
98
99 public void storeSessionInfoToMessage(MuleSession session, MuleMessage message) throws MuleException
100 {
101 StringBuffer buf = new StringBuffer();
102 buf.append(getSessionIDKey()).append("=").append(session.getId());
103 for (Iterator iterator = session.getPropertyNames(); iterator.hasNext();)
104 {
105 Object o = iterator.next();
106 buf.append(";");
107 buf.append(o).append("=").append(session.getProperty(o));
108 if (logger.isDebugEnabled())
109 {
110 logger.debug("Adding property to session header: " + o + "=" + session.getProperty(o));
111 }
112 }
113 String sessionString = buf.toString();
114 if (logger.isDebugEnabled())
115 {
116 logger.debug("Adding session header to message: " + sessionString);
117 }
118 sessionString = (String) encoder.transform(sessionString);
119 message.setProperty(MuleProperties.MULE_SESSION_PROPERTY, sessionString);
120 }
121
122 public String getSessionIDKey()
123 {
124 return "ID";
125 }
126 }