You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by fz...@omnytex.com on 2004/12/21 22:22:15 UTC
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()
RE: Addition to struts.utils packes
Posted by Alan Mehio <al...@yahoo.co.uk>.
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: fzlists@omnytex.com [mailto:fzlists@omnytex.com]
> 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: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org