package org.juxtasoftware;
import java.util.ArrayList;
import java.util.List;
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.data.ClientInfo;
import org.restlet.data.MediaType;
import org.restlet.data.Preference;
import org.restlet.routing.Filter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Filter to detect dotted typs in request segments. It will strip
* the type info from the segment and reset the Accept headers
* appropriately.
*
* @author loufoster
*
*/
public class RequestFilter extends Filter {
private static final Logger LOG = LoggerFactory.getLogger(Constants.WS_LOGGER_NAME);
@Override
protected int doHandle(Request request, Response response) {
String lastSegment = request.getResourceRef().getLastSegment();
if ( lastSegment.contains(".json")) {
request.getResourceRef().setLastSegment(lastSegment.substring(0, lastSegment.length()-5));
setAccepts( request, MediaType.APPLICATION_JSON);
} else if ( lastSegment.contains(".xml")) {
request.getResourceRef().setLastSegment(lastSegment.substring(0, lastSegment.length()-4));
setAccepts( request, MediaType.TEXT_XML);
} else if ( lastSegment.contains(".txt")) {
request.getResourceRef().setLastSegment(lastSegment.substring(0, lastSegment.length()-4));
setAccepts( request, MediaType.TEXT_PLAIN);
} else if ( lastSegment.contains(".html")) {
request.getResourceRef().setLastSegment(lastSegment.substring(0, lastSegment.length()-5));
setAccepts( request, MediaType.TEXT_HTML);
}
int resp = super.doHandle(request, response);
// collect info and write out the request/response details to the log file
ClientInfo info = request.getClientInfo();
String clientIp = info.getAddress();
String user = "-";
if (info.getUser() != null ) {
user = info.getUser().toString();
}
LOG.info(clientIp+"\t"+user+"\t"+request.toString()+"\t"+response.getStatus().getCode()+"\t"+info.getAgent());
return resp;
}
private void setAccepts(Request request, MediaType mediaType) {
Preference<MediaType> pref = new Preference<MediaType>( mediaType );
List<Preference<MediaType>> accept = new ArrayList<Preference<MediaType>>();
accept.add(pref);
request.getClientInfo().setAcceptedMediaTypes(accept);
}
}