package br.com.arsmachina.eloquentia.tapestry.services;
import java.util.Arrays;
import org.apache.tapestry5.EventContext;
import br.com.arsmachina.eloquentia.controller.PageController;
import br.com.arsmachina.eloquentia.entity.Page;
/**
* Default implementation of {@link PageActivationContextService}.
*
* @author Thiago H. de Paula Figueiredo (http://machina.com.br/thiago)
*/
public class PageActivationContextServiceImpl implements PageActivationContextService {
private static final String SEPARATOR = "/";
final private PageController pageController;
/**
* Single constructor of this class.
*
* @param pageController a {@link PageController}.
*/
public PageActivationContextServiceImpl(PageController pageController) {
super();
this.pageController = pageController;
}
public Object toActivationContext(Page page) {
Object activationContext = null;
if (page != null) {
activationContext = toActivationContext(page.getUri());
}
return activationContext;
}
public Object toActivationContext(final String uri) {
Object activationContext = null;
if (uri != null) {
activationContext = Arrays.asList(uri.split(SEPARATOR));
}
return activationContext;
}
public Page toPage(EventContext eventContext) {
Page page = null;
final int count = eventContext.getCount();
if (count > 0) {
// optimize for most common case
String uri = eventContext.get(String.class, 0);
if (count > 1) {
// join all the value to get the uri
// uri has the first value of the context right now.
StringBuilder builder = new StringBuilder(uri);
for (int i = 1; i < count; i++) {
builder.append(SEPARATOR);
builder.append(eventContext.get(String.class, i));
}
uri = builder.toString();
}
page = pageController.findByUri(uri);
}
return page;
}
}