content: package com.aimmac23.hub.servlet;
  
  import java.io.IOException;
  import java.util.HashMap;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  import org.apache.http.HttpStatus;
  import org.json.JSONException;
  import org.json.JSONObject;
  import org.openqa.grid.internal.ExternalSessionKey;
  
  import com.aimmac23.hub.HubVideoRegistry;
  import com.aimmac23.hub.videostorage.StoredVideoInfoContext;
  
  /**
   * A servlet to fetch information about videos for a given sessionId.
   * 
   * This servlet exists because some storage schemes can provide a location for a video
   * without the Hub being involved in the download/presentation.
   * 
   * Note that videos are not available until you have closed the Selenium Session
   * (calling driver.quit(), for example).
   * 
   * @author Alasdair Macmillan
   *
   */
  public class HubVideoInfoServlet extends AbstractHubVideoServlet {
  	
  	private static final Logger log = Logger.getLogger(HubVideoInfoServlet.class.getName());
  
  	private static final long serialVersionUID = 1L;
  	
  	static {
  		try {
  			// force this class to be initialized, so any errors are thrown at startup instead of first use
  			Class.forName(HubVideoRegistry.class.getCanonicalName());
  		} 
  		catch (ClassNotFoundException e) {
  			// Can't happen
  		}
  	}
  	
  	@Override
  	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  			throws ServletException, IOException {
  		String sessionId = req.getParameter("sessionId");
  		
  		if(sessionId == null) {
  			resp.setStatus(HttpStatus.SC_BAD_REQUEST);
  			resp.getWriter().write("Missing parameter: 'sessionId'");
  			return;
  		}
  		
  		if(!checkValidSessionId(sessionId, resp)) {
  			// response writing already handled
  			return;
  		}
  		
  		StoredVideoInfoContext videoInfoForSession;
  		try {
  			videoInfoForSession = HubVideoRegistry.getVideoInfoForSession(new ExternalSessionKey(sessionId));
  		} catch (Exception e) {
  			log.log(Level.WARNING, "Caught exception when fetching video information for " + sessionId, e);
  			resp.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
  			resp.getWriter().write("Internal error when fetching video information");
  			return;
  		}
  		
  		if(!videoInfoForSession.isVideoFound()) {
  			resp.setStatus(HttpStatus.SC_NOT_FOUND);
  			resp.getWriter().write("Video not found for session: " + sessionId);
  			videoInfoForSession.close();
  			return;
  		}
  		
  		HashMap<String, Object> responseMap = new HashMap<String, Object>();
  		if(videoInfoForSession.getContentLengthIfKnown() != null) {
  			responseMap.put("fileSize", videoInfoForSession.getContentLengthIfKnown());	
  		}
  		
  		
  		responseMap.put("storageType", HubVideoRegistry.getVideoStoreType());
  		responseMap.put("additional", videoInfoForSession.additionalInformation());
  		
  		// we don't need this anymore
  		videoInfoForSession.close();
  		
  		String json;
  		try {
  			json = new JSONObject(responseMap).toString(4);
  		} catch (JSONException e) {
  			resp.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
  			log.log(Level.WARNING, "Threw exception when writing JSON", e);
  			return;
  		}
  		resp.setStatus(HttpStatus.SC_OK);
  		resp.getWriter().write(json);
  	}
  }
  