package org.richfaces.demo.common.navigation;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.application.NavigationCase;
import javax.faces.application.NavigationHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
@ManagedBean
@SessionScoped
public class DemoNavigator implements Serializable {
private static final long serialVersionUID = 3970933260901989658L;
public static final String MOBILE_SUPPORT_PARAM = "org.richfaces.request.mobile";
private static final String DEMO_VIEW_PARAMETER = "demo";
private static final String SAMPLE_VIEW_PARAMETER = "sample";
private static final String SEPARATOR = "/";
private static final String SAMPLE_PREFIX = "-sample";
private static final String SAMPLES_FOLDER = "samples/";
@ManagedProperty(value = "#{navigationParser.groupsList}")
private List<GroupDescriptor> groups;
private DemoDescriptor currentDemo;
private SampleDescriptor currentSample;
private String sample;
private String demo;
@PostConstruct
public void init() {
currentDemo = null;
currentSample = null;
groups = new ArrayList<GroupDescriptor>(Collections2.filter(groups, new Predicate<GroupDescriptor>() {
public boolean apply(GroupDescriptor input) {
return input.hasEnabledItems();
}
}));
}
public DemoDescriptor getCurrentDemo() {
String id = getViewParameter(DEMO_VIEW_PARAMETER);
if (currentDemo == null || !currentDemo.getId().equals(id)) {
if (id != null) {
currentDemo = findDemoById(id);
currentSample = null;
}
if (currentDemo == null) {
currentDemo = groups.iterator().next().getDemos().iterator().next();
currentSample = null;
}
}
return currentDemo;
}
public SampleDescriptor getCurrentSample() {
String id = getViewParameter(SAMPLE_VIEW_PARAMETER);
if (currentSample == null || !currentSample.getId().equals(id)) {
if (id != null) {
currentSample = getCurrentDemo().getSampleById(id);
}
if (currentSample == null) {
currentSample = getCurrentDemo().getSamples().iterator().next();
}
}
return currentSample;
}
private String getViewParameter(String name) {
FacesContext fc = FacesContext.getCurrentInstance();
String param = (String) fc.getExternalContext().getRequestParameterMap().get(name);
if (param != null && param.trim().length() > 0) {
return param;
} else {
return null;
}
}
public DemoDescriptor findDemoById(String id) {
Iterator<GroupDescriptor> it = groups.iterator();
while (it.hasNext()) {
GroupDescriptor group = it.next();
Iterator<DemoDescriptor> dit = group.getDemos().iterator();
while (dit.hasNext()) {
DemoDescriptor locDemo = (DemoDescriptor) dit.next();
if (locDemo.getId().equals(id)) {
return locDemo;
}
}
}
return null;
}
public String getSampleURI() {
FacesContext context = FacesContext.getCurrentInstance();
NavigationHandler handler = context.getApplication().getNavigationHandler();
if (handler instanceof ConfigurableNavigationHandler) {
ConfigurableNavigationHandler navigationHandler = (ConfigurableNavigationHandler) handler;
demo = getCurrentDemo().getId();
sample = getCurrentSample().getId();
NavigationCase navCase = navigationHandler.getNavigationCase(context, null, "/richfaces" + SEPARATOR
+ getCurrentDemo().getId() + SEPARATOR + getCurrentSample().getId());
if (navCase == null) {
navCase = new NavigationCase("/index.xhtml", null, null, null, "/richfaces/ajax/ajax.xhtml", null, false,
true);
}
return navCase.getToViewId(context);
}
return null;
}
/**
* @return actual sample inclusion src Consider that: 1) all the samples should be placed in "samples" subfolder of the
* actual sample 2) all the samples pages should use the same name as main sample page with "-sample" prefix
*/
public String getSampleIncludeURI() {
String sampleURI = getSampleURI();
StringBuffer sampleURIBuffer = new StringBuffer(sampleURI);
int folderOffset = sampleURIBuffer.lastIndexOf(currentSample.getId());
int fileNameOffset = sampleURIBuffer.lastIndexOf(currentSample.getId()) + currentSample.getId().length()
+ SAMPLE_PREFIX.length() + 1;
String result = new StringBuffer(sampleURI).insert(folderOffset, SAMPLES_FOLDER).insert(fileNameOffset, SAMPLE_PREFIX)
.toString();
return result;
}
public List<GroupDescriptor> getGroups() {
return groups;
}
public void setGroups(List<GroupDescriptor> groups) {
this.groups = groups;
}
public void getFilteredGroups() {
}
public String getSample() {
return sample;
}
public void setSample(String sample) {
this.sample = sample;
}
public String getDemo() {
return demo;
}
public void setDemo(String demo) {
this.demo = demo;
}
}