package controllers.origo.core;
import models.origo.core.Alias;
import origo.helpers.NavigationHelper;
import origo.helpers.NodeHelper;
import origo.helpers.SettingsHelper;
import origo.helpers.ThemeHelper;
import origo.listeners.PageNotFoundException;
import play.Logger;
import play.modules.origo.core.Node;
import play.modules.origo.core.ui.NavigationElement;
import play.modules.origo.core.ui.RenderedNode;
import play.mvc.results.Redirect;
import java.util.Collection;
public class CoreLoader {
public static RenderedNode getStartPage() {
try {
return loadAndDecorateStartPage();
} catch (PageNotFoundException e) {
throw redirectToPageNotFoundPage();
} catch (Exception e) {
Logger.error("An exception occurred while loading the start page: " + e.getMessage());
throw redirectToInternalServerErrorPage();
}
}
public static RenderedNode getPage(String identifier) {
try {
return loadAndDecoratePage(identifier, 0);
} catch (PageNotFoundException e) {
throw redirectToPageNotFoundPage();
} catch (Exception e) {
Logger.error("An exception occurred while loading the page [" + identifier + "]: " + e.getMessage());
throw redirectToInternalServerErrorPage();
}
}
public static RenderedNode getPage(String identifier, long version) {
try {
return loadAndDecoratePage(identifier, version);
} catch (PageNotFoundException e) {
throw redirectToPageNotFoundPage();
} catch (Exception e) {
Logger.error("An exception occurred while loading the page [" + identifier + "] with specific version [" + version + "]: " + e.getMessage());
throw redirectToInternalServerErrorPage();
}
}
private static RenderedNode loadAndDecorateStartPage() {
String startPage = SettingsHelper.Core.getStartPage();
Logger.debug("Loading Start Page [" + startPage + "]");
return loadAndDecoratePage(startPage, 0);
}
public static Redirect redirectToPageNotFoundPage() {
Logger.debug("Redirecting to Page-Not-Found Page");
String pageNotFoundPage = SettingsHelper.Core.getPageNotFoundPage();
Collection<Alias> aliases = Alias.findWithPageId(pageNotFoundPage);
if (aliases.iterator().hasNext()) {
Alias alias = aliases.iterator().next();
return new Redirect(SettingsHelper.Core.getBaseUrl() + "" + alias.path, false);
} else {
// Defaulting to /page-not-found
return new Redirect(SettingsHelper.Core.getBaseUrl() + "page-not-found", false);
}
}
public static Redirect redirectToInternalServerErrorPage() {
Logger.debug("Redirecting to Internal Error Page");
String internalServerErrorPage = SettingsHelper.Core.getInternalServerErrorPage();
Collection<Alias> aliases = Alias.findWithPageId(internalServerErrorPage);
if (aliases.iterator().hasNext()) {
Alias alias = aliases.iterator().next();
return new Redirect(SettingsHelper.Core.getBaseUrl() + "" + alias.path, false);
} else {
// Defaulting to /error
return new Redirect(SettingsHelper.Core.getBaseUrl() + "error", false);
}
}
private static RenderedNode loadAndDecoratePage(String identifier, long version) {
Node node = loadNode(identifier, version);
return decorateNode(node);
}
private static Node loadNode(String identifier, long version) {
Logger.trace("Trying to find alias for [" + identifier + "]");
Alias alias = Alias.findWithPath(identifier);
if (alias != null) {
Logger.debug("Found alias: " + alias.toString());
return loadByNodeIdAndVersion(alias.pageId, version);
} else {
Logger.debug("No Alias found trying [" + identifier + "] as nodeId");
return loadByNodeIdAndVersion(identifier, version);
}
}
private static Node loadByNodeIdAndVersion(String identifier, long version) {
Node node;
if (version != 0) {
node = NodeHelper.load(identifier, version);
} else {
node = NodeHelper.load(identifier);
}
if (Logger.isDebugEnabled()) {
Logger.debug("Loaded " + node.toString());
}
return node;
}
private static RenderedNode decorateNode(Node node) {
RenderedNode renderedNode = ThemeHelper.decorate(node);
if (Logger.isDebugEnabled()) {
Logger.debug("Decorated " + renderedNode);
}
return renderedNode;
}
public static Collection<NavigationElement> getNavigation(String identifier) {
return getNavigation(identifier, 0);
}
public static Collection<NavigationElement> getNavigation(String identifier, long version) {
Node node = loadNode(identifier, version);
Collection<NavigationElement> navigationLinks = NavigationHelper.getNavigation(node, NavigationElement.FRONT);
if (Logger.isDebugEnabled()) {
Logger.debug("Navigation loaded " + navigationLinks);
}
return navigationLinks;
}
}