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
*/