diff --git a/ccm-cms/src/main/java/org/librecms/pages/PageManager.java b/ccm-cms/src/main/java/org/librecms/pages/PageManager.java
new file mode 100644
index 000000000..4c6ac65d9
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pages/PageManager.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pages;
+
+import org.libreccm.categorization.Category;
+import org.libreccm.categorization.CategoryRepository;
+
+import java.util.Optional;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class PageManager {
+
+ @Inject
+ private CategoryRepository categoryRepo;
+
+ @Inject
+ private PageRepository pageRepo;
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public Page findPageForCategory(final Category category) {
+
+ final Optional page = pageRepo.findPageForCategory(category);
+
+ if (page.isPresent()) {
+ return page.get();
+ } else {
+ final Category forCategory = categoryRepo
+ .findById(category.getObjectId())
+ .orElseThrow(() -> new IllegalArgumentException(String
+ .format("No Category with ID %d in the database.",
+ category.getObjectId())));
+
+ if (forCategory.getParentCategory() == null) {
+ return new Page();
+ } else {
+ return findPageForCategory(forCategory.getParentCategory());
+ }
+ }
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public Page createPageForCategory(final Category category) {
+
+ final Page page = new Page();
+ page.setCategory(category);
+
+ pageRepo.save(page);
+
+ 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 75df6b286..ed7daf702 100644
--- a/ccm-cms/src/main/java/org/librecms/pages/Pages.java
+++ b/ccm-cms/src/main/java/org/librecms/pages/Pages.java
@@ -63,26 +63,6 @@ import static org.librecms.CmsConstants.*;
query = "SELECT (CASE WHEN COUNT(p) > 0 THEN true ELSE false END) "
+ "FROM Pages p JOIN p.site s "
+ "WHERE s.defaultSite = true")
- ,
- @NamedQuery(
- name = "Pages.findPageModelForIndexPage",
- query = "SELECT DISTINCT m "
- + "FROM PageModel m "
- + "JOIN m.categories c "
- + "WHERE c.category = :category "
- + "AND c.type = '"
- + PagesConstants.CATEGORIZATION_TYPE_PAGE_MODEL_INDEX + "' "
- + "AND m.version = :version")
- ,
- @NamedQuery(
- name = "Pages.findPageModelForItemPage",
- query = "SELECT DISTINCT m "
- + "FROM PageModel m "
- + "JOIN m.categories c "
- + "WHERE c.category = :category "
- + "AND c.type = '"
- + PagesConstants.CATEGORIZATION_TYPE_PAGE_MODEL_ITEM + "' "
- + "AND m.version = :version")
})
public class Pages extends CcmApplication implements Serializable {
diff --git a/ccm-cms/src/main/java/org/librecms/pages/PagesConstants.java b/ccm-cms/src/main/java/org/librecms/pages/PagesManager.java
similarity index 67%
rename from ccm-cms/src/main/java/org/librecms/pages/PagesConstants.java
rename to ccm-cms/src/main/java/org/librecms/pages/PagesManager.java
index e380b9d6b..bdb287de6 100644
--- a/ccm-cms/src/main/java/org/librecms/pages/PagesConstants.java
+++ b/ccm-cms/src/main/java/org/librecms/pages/PagesManager.java
@@ -18,19 +18,29 @@
*/
package org.librecms.pages;
+import org.libreccm.categorization.Domain;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+
/**
*
* @author Jens Pelzetter
*/
-public final class PagesConstants {
-
- private PagesConstants() {
- //Nothing
+@RequestScoped
+public class PagesManager {
+
+ @Inject
+ private PagesRepository pagesRepo;
+
+ public Pages createPages(final Domain domain) {
+
+ final Pages pages = new Pages();
+ pages.setCategoryDomain(domain);
+
+ pagesRepo.save(pages);
+
+ return pages;
}
-
- public static final String CATEGORIZATION_TYPE_PAGE_MODEL_INDEX
- = "page_model_index";
- public static final String CATEGORIZATION_TYPE_PAGE_MODEL_ITEM
- = "page_model_item";
-
+
}
diff --git a/ccm-cms/src/main/java/org/librecms/pages/PagesRepository.java b/ccm-cms/src/main/java/org/librecms/pages/PagesRepository.java
index 8d11f87d3..b9b212127 100644
--- a/ccm-cms/src/main/java/org/librecms/pages/PagesRepository.java
+++ b/ccm-cms/src/main/java/org/librecms/pages/PagesRepository.java
@@ -69,40 +69,6 @@ public class PagesRepository extends AbstractEntityRepository {
}
}
- @Transactional(Transactional.TxType.REQUIRED)
- public Optional findPageModelForIndexPage(
- final Category category,
- final PageModelVersion version) {
-
- final TypedQuery query = getEntityManager()
- .createNamedQuery("Pages.findPageModelForIndexPage", PageModel.class);
- query.setParameter("category", category);
- query.setParameter("version", version.toString());
-
- try {
- return Optional.of(query.getSingleResult());
- } catch(NoResultException ex) {
- return Optional.empty();
- }
- }
-
- @Transactional(Transactional.TxType.REQUIRED)
- public Optional findPageModelForItemPage(
- final Category category,
- final PageModelVersion version) {
-
- final TypedQuery query = getEntityManager()
- .createNamedQuery("Pages.findPageModelForItemPage", PageModel.class);
- query.setParameter("category", category);
- query.setParameter("version", version.toString());
-
- try {
- return Optional.of(query.getSingleResult());
- } catch(NoResultException ex) {
- return Optional.empty();
- }
- }
-
@Override
public Class getEntityClass() {
return Pages.class;
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 1775789bb..8ed6d2c43 100644
--- a/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java
+++ b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java
@@ -23,7 +23,6 @@ import org.libreccm.categorization.CategoryManager;
import org.libreccm.categorization.CategoryRepository;
import org.libreccm.pagemodel.PageModel;
import org.libreccm.pagemodel.PageModelManager;
-import org.libreccm.pagemodel.PageModelVersion;
import org.libreccm.sites.Site;
import org.libreccm.sites.SiteRepository;
import org.libreccm.theming.ThemeInfo;
@@ -32,7 +31,6 @@ import org.libreccm.theming.Themes;
import java.util.HashMap;
import java.util.Map;
-import java.util.Optional;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
@@ -75,6 +73,12 @@ public class PagesRouter {
@Inject
private PageModelManager pageModelManager;
+ @Inject
+ private PageRepository pageRepo;
+
+ @Inject
+ private PageManager pageManager;
+
@Inject
private SiteRepository siteRepo;
@@ -84,7 +88,7 @@ public class PagesRouter {
@Path("/index.{lang}.html")
@Produces("text/html")
@Transactional(Transactional.TxType.REQUIRED)
- public String getCategoryIndexPage(
+ public String getCategoryIndexPageAsHtml(
@Context
final UriInfo uriInfo,
@PathParam("page")
@@ -126,19 +130,18 @@ public class PagesRouter {
page,
domain)));
- final Optional pageModel = pagesRepo
- .findPageModelForIndexPage(category,
- PageModelVersion
- .valueOf(pageModelVersion));
+ final Page pageConf = pageManager.findPageForCategory(category);
+
+ final PageModel pageModel = pageConf.getIndexPageModel();
final Map parameters = new HashMap<>();
parameters.put("currentCategory", category);
final Map buildResult;
- if (pageModel.isPresent()) {
- buildResult = pageBuilder.buildPage(pageModel.get(), parameters);
- } else {
+ if (pageModel == null) {
buildResult = pageBuilder.buildPage(parameters);
+ } else {
+ buildResult = pageBuilder.buildPage(pageModel, parameters);
}
final ThemeInfo themeInfo;
@@ -163,11 +166,11 @@ public class PagesRouter {
return themes.process(buildResult, themeInfo);
}
-
- @Path("/index.{lang}.tree")
+
+ @Path("/index.{lang}.json")
@Produces("text/html")
@Transactional(Transactional.TxType.REQUIRED)
- public String getCategoryIndexPageTree(
+ public String getCategoryIndexPageAsJson(
@Context
final UriInfo uriInfo,
@PathParam("page")
@@ -183,7 +186,30 @@ public class PagesRouter {
@QueryParam("pagemodel-version")
@DefaultValue("LIVE")
final String pageModelVersion) {
-
+
+ throw new UnsupportedOperationException();
+ }
+
+ @Path("/index.{lang}.xml")
+ @Produces("text/html")
+ @Transactional(Transactional.TxType.REQUIRED)
+ public String getCategoryIndexPageAsXml(
+ @Context
+ final UriInfo uriInfo,
+ @PathParam("page")
+ final String page,
+ @PathParam("lang")
+ final String language,
+ @QueryParam("theme")
+ @DefaultValue("--DEFAULT--")
+ final String theme,
+ @QueryParam("theme-version")
+ @DefaultValue("LIVE")
+ final String themeVersion,
+ @QueryParam("pagemodel-version")
+ @DefaultValue("LIVE")
+ final String pageModelVersion) {
+
throw new UnsupportedOperationException();
}