/**
* (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jabylon.rest.ui.wicket;
import java.util.List;
import org.apache.wicket.DefaultExceptionMapper;
import org.apache.wicket.Session;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.Url.QueryParameter;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.http.handler.RedirectRequestHandler;
import org.eclipse.emf.cdo.util.ObjectNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CustomExceptionMapper extends DefaultExceptionMapper {
private static final Logger LOG = LoggerFactory.getLogger(CustomExceptionMapper.class);
@Override
public IRequestHandler map(Exception e) {
if (e instanceof ObjectNotFoundException) {
//see https://github.com/jutzig/jabylon/issues/175
Request request = RequestCycle.get().getRequest();
Url url = request.getUrl();
List<QueryParameter> parameters = url.getQueryParameters();
boolean redirected = false;
for (QueryParameter queryParameter : parameters) {
if(queryParameter.getValue().isEmpty() && queryParameter.getName().matches("\\d+")) {
url.removeQueryParameters(queryParameter.getName());
LOG.error("Detected request to expired CDO ID. Attempting redirect to "+url.toString(),e);
Session.get().error("Sorry, this page content has expired. Please try again");
redirected = true;
break;
}
}
if(redirected)
return new RedirectRequestHandler("/"+url.toString());
}
return super.map(e);
}
}