/**
* (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.pages;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.common.util.URI;
import org.jabylon.common.resolver.URIResolver;
import org.jabylon.rest.ui.model.EObjectModel;
import org.jabylon.rest.ui.model.IEObjectModel;
/**
* @author Johannes Utzig (jutzig.dev@googlemail.com)
*
*/
public class GenericResolvablePage<T extends CDOObject> extends GenericPage<T> {
private static final long serialVersionUID = 1L;
@Inject
private URIResolver lookup;
public GenericResolvablePage(PageParameters parameters) {
super(parameters);
}
public void setModel(IEObjectModel<T> model) {
super.setModel(model);
}
protected IEObjectModel<T> createModel(T object) {
return new EObjectModel<T>(object);
}
public IEObjectModel<T> getModel() {
return (IEObjectModel<T>) super.getModel();
}
@Override
protected void preConstruct() {
T modelObject = getModelObject();
if(modelObject==null)
{
throw new AbortWithHttpErrorCodeException(404, "Path does not exist "+getPageParameters());
}
}
@Override
protected IModel<T> createModel(PageParameters params) {
T result = resolveModel(params);
if(result==null)
throw new AbortWithHttpErrorCodeException(404, "Path does not exist "+getPageParameters());
return createModel(result);
}
protected T resolveModel(PageParameters params) {
List<String> segments = new ArrayList<String>(params.getIndexedCount());
for (StringValue value : params.getValues("segment")) {
if (value.toString() != null && !value.toString().isEmpty())
segments.add(value.toString());
}
for (int i = 0; i < params.getIndexedCount(); i++) {
StringValue value = params.get(i);
if (value.toString() != null && !value.toString().isEmpty())
segments.add(value.toString());
}
T lookup = doLookup(segments);
return (T)lookup;
}
@SuppressWarnings("unchecked")
protected T doLookup(List<String> segments) {
String path = getURIPath(segments);
URI uri = URI.createURI(path,true);
return (T) lookup.resolve(uri);
}
private String getURIPath(List<String> segments) {
StringBuilder builder = new StringBuilder();
for (String string : segments) {
builder.append(URI.encodeSegment(string, true));
builder.append("/");
}
if(builder.length()>0)
builder.setLength(builder.length()-1);
else
builder.append("workspace");
return builder.toString();
}
public URIResolver getLookup() {
return lookup;
}
}