/* Copyright (C) 2013 Tomas Matula <tomas.matula@eea.sk>
*
* This file is part of Open Data Node.
*
* Open Data Node is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Open Data Node is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Open Data Node. If not, see <http://www.gnu.org/licenses/>.
*/
package sk.opendatanode.utils.http;
import java.util.ArrayList;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.model.IModel;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
public abstract class ContentNegotiablePage extends WebPage {
private static final long serialVersionUID = 1L;
public ContentNegotiablePage() {
super();
generateContentCheck(negotiateContent());
}
public ContentNegotiablePage(IModel<?> model) {
super(model);
generateContentCheck(negotiateContent());
}
public ContentNegotiablePage(PageParameters parameters) {
super(parameters);
generateContentCheck(negotiateContent());
}
/**
* This method should define available content for implemented page.
* @param contentTypes empty list
* @return list of available content sorted by preference on server side
*/
abstract public ArrayList<ContentTypes> defineAvailableContent(ArrayList<ContentTypes> contentTypes);
/**
* Handles content generation according to content type parsed form HTTP header
* @param contentType
*/
abstract public void generateContent(ContentTypes contentType);
private ContentTypes negotiateContent() {
RequestCycle requestCycle = RequestCycle.get();
ServletWebRequest request = (ServletWebRequest) requestCycle.getRequest();
return ContentNegotiation.parseHttpContext(request.getHeader("Accept"),
defineAvailableContent(new ArrayList<ContentTypes>()));
}
private void generateContentCheck(ContentTypes contentType) {
if (contentType == null)
throw new AbortWithHttpErrorCodeException(406);
generateContent(contentType);
}
}