diff --git a/ccm-cms/src/main/java/org/librecms/pages/CmsPageBuilder.java b/ccm-cms/src/main/java/org/librecms/pages/CmsPageRenderer.java similarity index 88% rename from ccm-cms/src/main/java/org/librecms/pages/CmsPageBuilder.java rename to ccm-cms/src/main/java/org/librecms/pages/CmsPageRenderer.java index 07ba16476..32b6c21de 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/CmsPageBuilder.java +++ b/ccm-cms/src/main/java/org/librecms/pages/CmsPageRenderer.java @@ -19,6 +19,7 @@ package org.librecms.pages; import org.libreccm.pagemodel.AbstractPageRenderer; +import org.libreccm.pagemodel.PageRenderer; import java.util.HashMap; import java.util.Map; @@ -26,11 +27,12 @@ import java.util.Map; import javax.enterprise.context.RequestScoped; /** - * + * Implementation of {@link PageRenderer} for CMS pages. + * * @author Jens Pelzetter */ @RequestScoped -public class CmsPageBuilder extends AbstractPageRenderer { +public class CmsPageRenderer extends AbstractPageRenderer { @Override public Map renderPage(final Map parameters) { diff --git a/ccm-cms/src/main/java/org/librecms/pages/PageManager.java b/ccm-cms/src/main/java/org/librecms/pages/PageManager.java index 7d79d1879..1da892bec 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/PageManager.java +++ b/ccm-cms/src/main/java/org/librecms/pages/PageManager.java @@ -52,7 +52,8 @@ public class PageManager { * no {@link Page} associated with the provided {@link Category} this method * will return the {@link Page} associated with the parent category. * - * @param category The {@link Category} which is associated with the {@link Page}. + * @param category The {@link Category} which is associated with the + * {@link Page}. * * @return The {@link Page} associated with the provided {@code category}. */ @@ -79,20 +80,32 @@ public class PageManager { } /** - * Create - * @param category - * @return + * Creates a new {@link Page} entity for a {@link Category} if there is no + * page for that category yet. + * + * @param category The category for which the new {@link Page} is created. + * + * @return A new {@link Page} if there is no {@link Page} for the provided + * {@code category}. If there is already a {@link Page} for that category + * the existing {@link Page} is returned. */ @Transactional(Transactional.TxType.REQUIRED) public Page createPageForCategory(final Category category) { - final Page page = new Page(); - pageRepo.save(page); - categoryManager.addObjectToCategory(page, - category, - CATEGORIZATION_TYPE_PAGE_CONF); + final Optional pageForCategory = pageRepo + .findPageForCategory(category); - return page; + if (pageForCategory.isPresent()) { + return pageForCategory.get(); + } else { + final Page page = new Page(); + pageRepo.save(page); + categoryManager.addObjectToCategory(page, + category, + CATEGORIZATION_TYPE_PAGE_CONF); + + return page; + } } } diff --git a/ccm-cms/src/main/java/org/librecms/pages/Pages.java b/ccm-cms/src/main/java/org/librecms/pages/Pages.java index 9f6f254cc..0bc68cf3f 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/Pages.java +++ b/ccm-cms/src/main/java/org/librecms/pages/Pages.java @@ -35,7 +35,7 @@ import static org.librecms.CmsConstants.*; /** * The {@code Pages} application. Each instance of this application provides the - * page tree for specific site. + * page tree for a specific site. * * @author Jens Pelzetter */ @@ -70,7 +70,7 @@ public class Pages extends SiteAwareApplication implements Serializable { private static final long serialVersionUID = -352205318143692477L; /** - * The category {@link Domain} which is used the model the page tree. + * The category {@link Domain} which is used to create the page tree. */ @OneToOne @JoinColumn(name = "CATEGORY_DOMAIN_ID") diff --git a/ccm-cms/src/main/java/org/librecms/pages/PagesCreator.java b/ccm-cms/src/main/java/org/librecms/pages/PagesCreator.java index 2016b7af3..a3f27710f 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/PagesCreator.java +++ b/ccm-cms/src/main/java/org/librecms/pages/PagesCreator.java @@ -26,7 +26,10 @@ import org.libreccm.web.CcmApplication; import javax.inject.Inject; /** - * + * Implementation of {@link ApplicationCreator} for the {@link Pages} application. + * + * Used in by the administration UI. + * * @author Jens Pelzetter */ public class PagesCreator implements ApplicationCreator { diff --git a/ccm-cms/src/main/java/org/librecms/pages/PagesManager.java b/ccm-cms/src/main/java/org/librecms/pages/PagesManager.java index f851e770f..1d11dfea1 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/PagesManager.java +++ b/ccm-cms/src/main/java/org/librecms/pages/PagesManager.java @@ -24,6 +24,7 @@ import org.libreccm.sites.Site; import org.libreccm.sites.SiteManager; import java.io.Serializable; +import java.util.Objects; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; @@ -45,17 +46,36 @@ public class PagesManager implements Serializable { @Inject private SiteManager siteManager; + /** + * Creates a new {@link Pages} instance. + * + * @param primaryUrl The primary URL under which the Admin UI for the + * instance will be available ({@code /ccm/{primaryUrl}) + * @param site The {@link Site} with which the new {@link Pages} is associated. + * @param domain The category system which used to model the page tree + * of the new {@link Pages} instance. + * + * @return The new {@link Pages} instance. + */ @RequiresPrivilege(PagesPrivileges.ADMINISTER_PAGES) @Transactional(Transactional.TxType.REQUIRED) public Pages createPages(final String primaryUrl, final Site site, final Domain domain) { + Objects.requireNonNull(primaryUrl); + Objects.requireNonNull(site); + Objects.requireNonNull(domain); + + if (primaryUrl.isEmpty() || primaryUrl.matches("\\s*")) { + throw new IllegalArgumentException("The primaryUrl can't be empty."); + } + final Pages pages = new Pages(); pages.setPrimaryUrl(primaryUrl); - + pagesRepo.save(pages); - + pages.setCategoryDomain(domain); pagesRepo.save(pages); diff --git a/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java index 63e272231..af34e5895 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java +++ b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java @@ -74,7 +74,7 @@ public class PagesRouter { private GlobalizationHelper globalizationHelper; @Inject - private CmsPageBuilder pageBuilder; + private CmsPageRenderer pageBuilder; @Inject private PagesRepository pagesRepo; @@ -226,7 +226,7 @@ public class PagesRouter { * @return */ @Path("/index.{lang}.json") - @Produces("text/html") + @Produces("text/json") @Transactional(Transactional.TxType.REQUIRED) public Map getCategoryIndexPageAsJson( @Context @@ -253,7 +253,7 @@ public class PagesRouter { * @return */ @Path("/index.{lang}.xml") - @Produces("text/html") + @Produces("text/xml") @Transactional(Transactional.TxType.REQUIRED) public Map getCategoryIndexPageAsXml( @Context @@ -320,7 +320,7 @@ public class PagesRouter { * * @return */ - @Path("/{name},html") + @Path("/{name}.html") public Response getItemPageAsHtml( @Context final UriInfo uriInfo, @PathParam("page") final String page, @@ -405,7 +405,8 @@ public class PagesRouter { * * @return */ - @Path("/{name}.{lang}.html") + @Path("/{name}.{lang}.json") + @Produces("text/json") public Map getItemPageAsJson( @Context final UriInfo uriInfo, @@ -438,7 +439,8 @@ public class PagesRouter { * * @return */ - @Path("/{name}.{lang}.html") + @Path("/{name}.{lang}.xml") + @Produces("text/xml") public Map getItemPageAsXml( @Context final UriInfo uriInfo, diff --git a/ccm-cms/src/main/java/org/librecms/pages/PagesServlet.java b/ccm-cms/src/main/java/org/librecms/pages/PagesServlet.java index cb217839a..2fb5af005 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/PagesServlet.java +++ b/ccm-cms/src/main/java/org/librecms/pages/PagesServlet.java @@ -40,7 +40,9 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** - * + * Servlet for the Admin UI for pages a {@link /ccm/{primaryUrl}}. The admin UI + * itself is implemented by {@link PagesAdminPage}. + * * @author Jens Pelzetter */ @WebServlet(urlPatterns = {"/templates/servlet/pages/*"}) @@ -77,25 +79,6 @@ public class PagesServlet extends BaseApplicationServlet { final PagesAdminPage page = new PagesAdminPage(); -// final URL originalUrl = (URL) request -// .getAttribute(BaseServlet.REQUEST_URL_ATTRIBUTE); -// final String pathInfo = originalUrl.getPathInfo(); - -// final String appPath; -// if (pathInfo.startsWith("/") && pathInfo.endsWith("/")) { -// appPath = pathInfo.substring(1, pathInfo.length() - 1); -// } else if (pathInfo.startsWith("/")) { -// appPath = pathInfo.substring(1); -// } else if (pathInfo.endsWith("/")) { -// appPath = pathInfo.substring(pathInfo.length() - 1); -// } else { -// appPath = pathInfo; -// } -// -// final CcmApplication application = applicationRepo -// .retrieveApplicationForPath(appPath) -// .orElseThrow(() -> new ServletException(String -// .format("No application for path %s", appPath))); if (!(application instanceof Pages)) { throw new ServletException( "Provided application is not an instance of Pages"); diff --git a/ccm-cms/src/main/java/org/librecms/pages/ThemeConfiguration.java b/ccm-cms/src/main/java/org/librecms/pages/ThemeConfiguration.java index af89ecb68..594c67fd2 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/ThemeConfiguration.java +++ b/ccm-cms/src/main/java/org/librecms/pages/ThemeConfiguration.java @@ -25,7 +25,7 @@ import javax.persistence.Column; import javax.persistence.Embeddable; /** - * Configuration for the {@link Page} and a {@link Site}. + * Theme configuration for the {@link Page} and a {@link Site}. * * @author Jens Pelzetter */