Thanks. I think it is useful since the user session size needs to be controlled in some big portal applications. It would be nice to include it into the struts utility package
> -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] > Sent: 21 December 2004 21:22 > To: dev@struts.apache.org > Subject: Addition to struts.utils packes > > > I recently had a need to determine the size of a user's current > session, and I didn't find any available option, so I rolled my > own. If I in fact didn't miss something and this really doesn't > exist somewhere already, then I'd like to offer it up for > inclusion in the struts.utils package. I can see this being a > new SessionUtils class. > > I wasn't sure how logging should be handled, so I converted what > I use over to simple System.out's. Obviously that needs to be > changed, but for now it's fine. It will only work with > serializable objects in session, and it probably has other > shortcomings that I'm not aware of. > > In any case, just calling getSessionSize(), passing it a valid > HTTPSession object, and off you go. As written, it dumps > information to stdout about all the objects encountered, but it > might be sufficient to remove all that and just let it return a > final value. I tend to prefer more information though. > > Here you go, hope it's useful... > > /** > * This method is used to get the total size of a current, > valid HTTPSession > * object it is passed. > * > * @param session A valid HTTPSession object > * @return The total size of session in bytes > */ > public static int getSessionSize(HttpSession session) { > > System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); > System.out.println("!!!!!!!!!! getSessionSize() !!!!!!!!!!"); > Enumeration enum = session.getAttributeNames(); > String name = null; > Object obj = null; > String serialOut; > String SIZE_DELIMITER = "size="; > int sizeIndex; > int objSize; > int totalSize = 0; > while (enum.hasMoreElements()) { > name = (String)enum.nextElement(); > obj = session.getAttribute(name); > serialOut = AppHelpers.serializiableTest(obj); > if ((sizeIndex = serialOut.lastIndexOf(SIZE_DELIMITER)) > 0) { > objSize = Integer.parseInt(serialOut.substring(sizeIndex > + SIZE_DELIMITER.length(), serialOut.lastIndexOf(')'))); > totalSize += objSize; > } > System.out.println("Attribute " + name + " - " + serialOut); > } > System.out.println("Current total session size = " + totalSize); > System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); > return totalSize; > > } > > > /** > * This method is used by the getSessionSize() method to determine if a > * given object is serializable. > * > * @param Object The object to test > * @return String A response string detailing the outcome of the test > */ > private static String serializiableTest(Object obj) { > > String ans = "ok"; > if (obj == null) { > return "Object is null"; > } else { > try { > ByteArrayOutputStream bastream = new ByteArrayOutputStream(); > ObjectOutputStream p = new ObjectOutputStream(bastream); > p.writeObject(obj); > ans = "OK (size=" + bastream.size() + ")"; > } catch (NotSerializableException ex) { > Field[] fields = obj.getClass().getDeclaredFields(); > ans = "NOT SERIALIZABLE (fields=" + fields + ")"; > ex.printStackTrace(); > Object fldObj = null; > if (fields != null && (fields.length != 0)) { > StringBuffer sb = new StringBuffer("\n" + ans + "["); > for (int i = 0; i < fields.length; i++) { > sb.append(fields[i].getName()); > try { > if (obj != null) { > fldObj = getFieldWithPrivilege(fields[i], obj); > } > sb.append("::"); > if (fldObj == null) { > sb.append("<field null>"); > } else { > sb.append(serializiableTest(fldObj)); > } > } catch (IllegalArgumentException aex) { > sb.append("::"); > sb.append("ILLEGAL ARGUMENT EXCEPTION"); > } > if (i != fields.length - 1) { > sb.append('\n'); > } > } > sb.append("]"); > ans = sb.toString(); > } > } catch (Exception ex) { > ans = "EXCEPTION: " + ex.getMessage(); > } > } > return obj.getClass().getName() + " is " + ans; > > } > > > /** > * This method is used by the serializiableTest() method to get the > * needed priveleges on a given field of a given object needed to > * perform the serializable test. > * > * @param Field The field to get priveleges on > Object The object to test > * @return Object A Priveleged reference to the field essentially > */ > private static Object getFieldWithPrivilege(Field fld, Object obj) { > > final Object obj2 = obj; > final Field fld2 = fld; > return AccessController.doPrivileged( > new PrivilegedAction() { > public Object run() { > try { > return fld2.get(obj2); > } catch (IllegalAccessException ex) { > ex.printStackTrace(); > return null; > } > } > } > ); > > } // End getFieldWithPrivilege() > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]