package org.netmelody.cieye.server.response.resource; import java.io.IOException; import java.util.Map.Entry; import org.apache.commons.io.IOUtils; import org.netmelody.cieye.core.logging.LogKeeper; import org.netmelody.cieye.core.logging.Logbook; import org.netmelody.cieye.server.response.CiEyeResponder; import org.netmelody.cieye.server.response.CiEyeResponse; import org.simpleframework.http.Request; import org.simpleframework.http.Response; import org.simpleframework.http.Status; import org.simpleframework.http.resource.Resource; public final class CiEyeResource implements Resource { private static final Logbook LOG = LogKeeper.logbookFor(CiEyeResource.class); private final CiEyeResponder responder; public CiEyeResource(CiEyeResponder responder) { this.responder = responder; } @Override public void handle(Request request, Response response) { try { final CiEyeResponse result = responder.respond(request); response.set("Content-Type", result.contentType); response.set("Server", "CiEye/1.0 (Simple 4.0)"); response.setDate("Date", result.date); response.setDate("Last-Modified", result.lastModified); response.setDate("Expires", result.expires); response.setContentLength(result.contentLength()); response.setCode(result.status.getCode()); response.setText(result.status.getDescription()); for (Entry<String, String> header : result.additionalStringHeaders.entrySet()) { response.set(header.getKey(), header.getValue()); } IOUtils.copy(result.inputStream(), response.getOutputStream()); } catch (Exception e) { LOG.error("Failed to respond to request for resource " + request.getPath().getPath(), e); response.setCode(Status.NOT_FOUND.getCode()); response.setText(Status.NOT_FOUND.getDescription()); } finally { try { response.close(); } catch (IOException e) { LOG.error("Failed to close response for resource " + request.getPath().getPath(), e); } } } }