Java tutorial
/** * Copyright 2010 Daniel Guermeur and Amy Unruh * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * See http://connectrapp.appspot.com/ for a demo, and links to more information * about this app and the book that it accompanies. */ package com.code.savemarks.utils; /** * Some code adapted from: the Google App Engine Virtual File System (GaeVFS) project, * http://code.google.com/p/gaevfs/ */ import static org.apache.commons.codec.binary.Base64.decodeBase64; import static org.apache.commons.codec.binary.Base64.encodeBase64; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import com.google.appengine.api.labs.taskqueue.QueueFailureException; public class Utils { private static final Logger log = Logger.getLogger(Utils.class.getName()); /** * Serialize an object into a byte array. * * @param obj An object to be serialized. * @return A byte array containing the serialized object * @throws QueueFailureException If an I/O error occurs during the * serialization process. */ public static byte[] serialize(Object obj) { try { ByteArrayOutputStream bytesOut = new ByteArrayOutputStream(); ObjectOutputStream objectOut = new ObjectOutputStream(new BufferedOutputStream(bytesOut)); objectOut.writeObject(obj); objectOut.close(); return encodeBase64(bytesOut.toByteArray()); } catch (IOException e) { throw new QueueFailureException(e); } } /** * Deserialize an object from an HttpServletRequest input stream. Does not * throw any exceptions; instead, exceptions are logged and null is returned. * * @param req An HttpServletRequest that contains a serialized object. * @return An object instance, or null if an exception occurred. */ public static Object deserialize(HttpServletRequest req) { if (req.getContentLength() == 0) { log.severe("request content length is 0"); return null; } try { byte[] bytesIn = new byte[req.getContentLength()]; req.getInputStream().readLine(bytesIn, 0, bytesIn.length); return deserialize(bytesIn); } catch (IOException e) { log.log(Level.SEVERE, "Error deserializing task", e); return null; // don't retry task } } /** * Deserialize an object from a byte array. Does not throw any exceptions; * instead, exceptions are logged and null is returned. * * @param bytesIn A byte array containing a previously serialized object. * @return An object instance, or null if an exception occurred. */ public static Object deserialize(byte[] bytesIn) { ObjectInputStream objectIn = null; try { bytesIn = decodeBase64(bytesIn); objectIn = new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(bytesIn))); return objectIn.readObject(); } catch (Exception e) { log.log(Level.SEVERE, "Error deserializing task", e); return null; // don't retry task } finally { try { if (objectIn != null) { objectIn.close(); } } catch (IOException ignore) { } } } public static String stackTraceToString(Throwable e) { String retValue = null; StringWriter sw = null; PrintWriter pw = null; try { sw = new StringWriter(); pw = new PrintWriter(sw); e.printStackTrace(pw); retValue = sw.toString(); } finally { try { if (pw != null) pw.close(); if (sw != null) sw.close(); } catch (IOException ignore) { } } return retValue; } } // end class