/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.riotfamily.pages.view;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.riotfamily.common.util.Generics;
import org.riotfamily.common.web.cache.tags.CacheTagUtils;
import org.riotfamily.common.web.support.ServletUtils;
import org.riotfamily.components.view.ContentContainerOwnerFacade;
import org.riotfamily.core.security.AccessController;
import org.riotfamily.pages.config.VirtualPageType;
import org.riotfamily.pages.model.Page;
/**
* @author Felix Gnass [fgnass at neteye dot de]
* @since 6.5
*/
public class PageFacade extends ContentContainerOwnerFacade {
private Page page;
public PageFacade(Page page, HttpServletRequest request) {
this(page, request, null);
}
public PageFacade(Page page, HttpServletRequest request,
HttpServletResponse response) {
super(page, request, response);
this.page = page;
}
public Page getPage() {
return page;
}
public boolean isRequestable() {
return (page.getContentContainer().getLiveVersion() != null
&& page.getSite().isEnabled())
|| AccessController.isAuthenticatedUser();
}
public String getRelativeUrl() {
return getRelativeUrl(null, true);
}
public String getRelativeUrl(String suffix) {
return getRelativeUrl(suffix, true);
}
public String getRelativeUrl(String suffix, boolean encode) {
StringBuilder url = new StringBuilder();
url.append(page.getPath());
if (suffix == null) {
suffix = page.getSite().getDefaultSuffix(page);
}
url.append(suffix);
if (encode && response != null) {
return ServletUtils.resolveAndEncodeUrl(url.toString(), request, response);
}
return ServletUtils.resolveUrl(url.toString(), request);
}
public String getUrl() {
return getUrl(null);
}
public String getUrl(String suffix) {
return getUrl(suffix, true);
}
public String getUrl(String suffix, boolean encode) {
if (!page.getSite().hostNameMatches(request.getServerName())) {
return getAbsoluteUrl(suffix);
}
return getRelativeUrl(suffix, encode);
}
public String getAbsoluteUrl() {
return getAbsoluteUrl(null);
}
public String getAbsoluteUrl(String suffix) {
return getAbsoluteUrl(suffix, true);
}
public String getAbsoluteUrl(String suffix, boolean encode) {
return page.getSite().makeAbsolute(request.isSecure(),
ServletUtils.getServerNameAndPort(request),
request.getContextPath(), getRelativeUrl(suffix, encode));
}
public String getSecureUrl() {
return getSecureUrl(null);
}
public String getSecureUrl(String suffix) {
return getSecureUrl(suffix, true);
}
public String getSecureUrl(String suffix, boolean encode) {
if (request.isSecure() && request.getServerName().equals(
page.getSite().getHostName())) {
return getUrl(suffix);
}
return page.getSite().makeAbsolute(true, ServletUtils.getServerNameAndPort(request),
request.getContextPath(), getRelativeUrl(suffix, encode));
}
public Collection<Page> getAncestors() {
LinkedList<Page> pages = Generics.newLinkedList();
Page page = this.page;
while (page != null) {
pages.addFirst(page);
page = page.getParent();
}
return pages;
}
public List<Page> getChildren() {
ArrayList<Page> result = Generics.newArrayList();
CacheTagUtils.tagIfSupported(page);
VirtualPageType type = page.getSite().getSchema().getVirtualChildType(page);
if (type != null) {
Collection<Page> children = type.listChildren(page);
CacheTagUtils.tagIfSupported(children);
result.addAll(filterPages(children)) ;
}
result.addAll(filterPages(page.getChildren()));
return result;
}
public List<Page> getSiblings() {
Page parent = page.getParent();
if (parent == null) {
return Collections.singletonList(page);
}
return new PageFacade(parent, request, response).getChildren();
}
public Page getPreviousSibling() {
List<Page> siblings = getSiblings();
int i = siblings.indexOf(page);
if (i > 0) {
return siblings.get(i - 1);
}
return null;
}
public Page getNextSibling() {
List<Page> siblings = getSiblings();
int i = siblings.indexOf(page);
if (i < siblings.size() - 1) {
return siblings.get(i + 1);
}
return null;
}
protected List<Page> filterPages(Collection<? extends Page> pages) {
ArrayList<Page> result = Generics.newArrayList();
for (Page page : pages) {
if (page.getContentContainer().getLiveVersion() != null || isPreview(page)) {
result.add(page);
}
}
return result;
}
}