diff --git a/ccm-cms/src/main/java/org/librecms/sites/Site.java b/ccm-cms/src/main/java/org/librecms/pages/Pages.java
similarity index 63%
rename from ccm-cms/src/main/java/org/librecms/sites/Site.java
rename to ccm-cms/src/main/java/org/librecms/pages/Pages.java
index cabf7f742..00b725735 100644
--- a/ccm-cms/src/main/java/org/librecms/sites/Site.java
+++ b/ccm-cms/src/main/java/org/librecms/pages/Pages.java
@@ -16,15 +16,15 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.librecms.sites;
+package org.librecms.pages;
import org.libreccm.categorization.Domain;
+import org.libreccm.sites.Site;
import org.libreccm.web.CcmApplication;
import java.io.Serializable;
import java.util.Objects;
-import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
@@ -39,48 +39,50 @@ import static org.librecms.CmsConstants.*;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "SITES", schema = DB_SCHEMA)
+@Table(name = "PAGES", schema = DB_SCHEMA)
@NamedQueries({
@NamedQuery(
- name = "Site.findByName",
- query = "SELECT s FROM Site s WHERE s.name = :name"
+ name = "Pages.findForSite",
+ query = "SELECT p FROM Pages p JOIN p.site s "
+ + "WHERE s.domainOfSite = :domain")
+ ,
+ @NamedQuery(
+ name = "Pages.findForDefaultSite",
+ query = "SELECT p FROM Pages p JOIN p.site s "
+ + "WHERE s.defaultSite = true"
)
+ ,
+ @NamedQuery(
+ name = "Pages.availableForSite",
+ query = "SELECT (CASE WHEN COUNT(s) > 0 THEN true ELSE false END) "
+ + "FROM Pages p JOIN p.site s "
+ + "WHERE s.domainOfSite = :domain")
+ ,
+ @NamedQuery(
+ name = "Pages.availableForDefaultSite",
+ query = "SELECT (CASE WHEN COUNT(p) > 0 THEN true ELSE false END) "
+ + "FROM Pages p JOIN p.site s "
+ + "WHERE s.defaultSite = true"),
+
})
-public class Site extends CcmApplication implements Serializable {
+public class Pages extends CcmApplication implements Serializable {
private static final long serialVersionUID = -352205318143692477L;
- /**
- * The domain of the site.
- */
- @Column(name = "NAME", unique = true)
- private String name;
-
- /**
- * Should this be the default site which is used when there is no matching
- * site?
- */
- @Column(name = "DEFAULT_SITE")
- private boolean defaultSite;
+ @OneToOne
+ @JoinColumn(name = "SITE_ID")
+ private Site site;
@OneToOne
@JoinColumn(name = "CATEGORY_DOMAIN_ID")
private Domain categoryDomain;
- public String getName() {
- return name;
+ public Site getSite() {
+ return site;
}
- public void setName(final String name) {
- this.name = name;
- }
-
- public boolean isDefaultSite() {
- return defaultSite;
- }
-
- public void setDefaultSite(boolean defaultSite) {
- this.defaultSite = defaultSite;
+ protected void setSite(final Site site) {
+ this.site = site;
}
public Domain getCategoryDomain() {
@@ -94,9 +96,8 @@ public class Site extends CcmApplication implements Serializable {
@Override
public int hashCode() {
int hash = 7;
- hash = 17 * hash + Objects.hashCode(name);
- hash = 17 * hash + (defaultSite ? 1 : 0);
hash = 17 * hash + Objects.hashCode(categoryDomain);
+ hash = 17 * hash + Objects.hashCode(site);
return hash;
}
@@ -115,19 +116,16 @@ public class Site extends CcmApplication implements Serializable {
return false;
}
- if (!(obj instanceof Site)) {
+ if (!(obj instanceof Pages)) {
return false;
}
- final Site other = (Site) obj;
+ final Pages other = (Pages) obj;
if (!other.canEqual(this)) {
return false;
}
- if (!Objects.equals(name, other.getName())) {
- return false;
- }
- if (defaultSite != other.isDefaultSite()) {
+ if (!Objects.equals(site, other.getSite())) {
return false;
}
@@ -136,17 +134,15 @@ public class Site extends CcmApplication implements Serializable {
@Override
public boolean canEqual(final Object obj) {
- return obj instanceof Site;
+ return obj instanceof Pages;
}
@Override
public String toString(final String data) {
return super.toString(String.format(
- ", name = \"%s\","
- + "defaultSite = %b%s",
- name,
- defaultSite,
+ ", site = \"%s\"%s",
+ Objects.toString(site),
data
));
}
diff --git a/ccm-cms/src/main/java/org/librecms/sites/Sites.java b/ccm-cms/src/main/java/org/librecms/pages/PagesApplication.java
similarity index 90%
rename from ccm-cms/src/main/java/org/librecms/sites/Sites.java
rename to ccm-cms/src/main/java/org/librecms/pages/PagesApplication.java
index 47e92256a..6c4bbdf58 100644
--- a/ccm-cms/src/main/java/org/librecms/sites/Sites.java
+++ b/ccm-cms/src/main/java/org/librecms/pages/PagesApplication.java
@@ -16,7 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.librecms.sites;
+package org.librecms.pages;
import java.util.HashSet;
import java.util.Set;
@@ -30,14 +30,14 @@ import javax.ws.rs.core.Application;
* @author Jens Pelzetter
*/
@ApplicationPath("/pages")
-public class Sites extends Application {
+public class PagesApplication extends Application {
@Override
public Set> getClasses() {
final Set> classes = new HashSet<>();
- classes.add(Pages.class);
+ classes.add(PagesRouter.class);
return classes;
}
diff --git a/ccm-cms/src/main/java/org/librecms/sites/SiteRepository.java b/ccm-cms/src/main/java/org/librecms/pages/PagesConstants.java
similarity index 60%
rename from ccm-cms/src/main/java/org/librecms/sites/SiteRepository.java
rename to ccm-cms/src/main/java/org/librecms/pages/PagesConstants.java
index 5901acd56..e380b9d6b 100644
--- a/ccm-cms/src/main/java/org/librecms/sites/SiteRepository.java
+++ b/ccm-cms/src/main/java/org/librecms/pages/PagesConstants.java
@@ -16,29 +16,21 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.librecms.sites;
-
-import org.libreccm.core.CcmObjectRepository;
-
-import javax.enterprise.context.RequestScoped;
-import javax.persistence.TypedQuery;
-import javax.transaction.Transactional;
+package org.librecms.pages;
/**
*
* @author Jens Pelzetter
*/
-@RequestScoped
-public class SiteRepository extends CcmObjectRepository {
+public final class PagesConstants {
- @Transactional(Transactional.TxType.REQUIRED)
- public Site findByName(final String name) {
-
- final TypedQuery query = getEntityManager()
- .createNamedQuery("Site.findByName", Site.class);
- query.setParameter("name", name);
-
- return query.getSingleResult();
+ private PagesConstants() {
+ //Nothing
}
+ 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
new file mode 100644
index 000000000..b4fafbe9c
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pages/PagesRepository.java
@@ -0,0 +1,95 @@
+/*
+ * 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 com.arsdigita.ui.admin.AdminUiConstants;
+
+import org.libreccm.core.AbstractEntityRepository;
+import org.libreccm.core.CcmObjectRepository;
+import org.libreccm.core.CoreConstants;
+import org.libreccm.security.RequiresPrivilege;
+import org.libreccm.sites.SiteRepository;
+import org.librecms.CmsConstants;
+import org.librecms.contentsection.privileges.AdminPrivileges;
+
+import java.util.Optional;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+import javax.persistence.NoResultException;
+import javax.persistence.TypedQuery;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class PagesRepository extends AbstractEntityRepository {
+
+ @Inject
+ private SiteRepository siteRepo;
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public Optional findPagesForSite(final String domainOfSite) {
+
+ if (siteRepo.hasSiteForDomain(domainOfSite)) {
+ final TypedQuery query = getEntityManager()
+ .createNamedQuery("Pages.findForSite", Pages.class);
+ query.setParameter("domain", domainOfSite);
+
+ try {
+ return Optional.of(query.getSingleResult());
+ } catch(NoResultException ex) {
+ return Optional.empty();
+ }
+ } else {
+ final TypedQuery query = getEntityManager()
+ .createNamedQuery("Pages.findForDefaultSite", Pages.class);
+ try {
+ return Optional.of(query.getSingleResult());
+ } catch (NoResultException ex) {
+ return Optional.empty();
+ }
+ }
+ }
+
+ @Override
+ public Class getEntityClass() {
+ return Pages.class;
+ }
+
+ @Override
+ public boolean isNew(final Pages pages) {
+ return pages.getObjectId() == 0;
+ }
+
+ @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
+ @Override
+ public void save(final Pages pages) {
+ super.save(pages);
+ }
+
+ @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
+ @Override
+ public void delete(final Pages pages) {
+ super.delete(pages);
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/sites/Pages.java b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java
similarity index 61%
rename from ccm-cms/src/main/java/org/librecms/sites/Pages.java
rename to ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java
index ae54bc66b..c972a2f84 100644
--- a/ccm-cms/src/main/java/org/librecms/sites/Pages.java
+++ b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java
@@ -16,22 +16,22 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.librecms.sites;
+package org.librecms.pages;
import org.libreccm.categorization.Category;
import org.libreccm.categorization.CategoryManager;
import org.libreccm.categorization.CategoryRepository;
import org.libreccm.pagemodel.PageModelManager;
-import java.util.Optional;
-
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.transaction.Transactional;
+import javax.ws.rs.DefaultValue;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
@@ -41,44 +41,64 @@ import javax.ws.rs.core.UriInfo;
*/
@RequestScoped
@Path("/{page:.+}")
-public class Pages {
-
+public class PagesRouter {
+
@Inject
private CategoryManager categoryManager;
@Inject
private CategoryRepository categoryRepo;
+
+
@Inject
private PageModelManager pageModelManager;
-
- @Inject
- private SiteRepository siteRepo;
- @Path("/")
+ @Inject
+ private PagesRepository siteRepo;
+
+ @Path("/index.{lang}.html")
@Produces("text/html")
@Transactional(Transactional.TxType.REQUIRED)
- public String getPage(@Context final UriInfo uriInfo,
- @PathParam("page") final String page) {
+ public String getCategoryIndexPage(
+ @Context final UriInfo uriInfo,
+ @PathParam("page") final String page,
+ @PathParam("lang") final String language,
+ @QueryParam("theme") @DefaultValue("--DEFAULT--") final String theme) {
- final String siteName = uriInfo.getBaseUri().getHost();
-
- final Site site = siteRepo.findByName(siteName);
- final Category category =categoryRepo
- .findByPath(site.getCategoryDomain(), page)
- .orElseThrow(() -> new NotFoundException(String.format(
+ final String domain = uriInfo.getBaseUri().getHost();
+
+ final Pages pages = siteRepo
+ .findPagesForSite(domain)
+ .orElseThrow(() -> new NotFoundException(String
+ .format("No Pages for domain \"%s\" available.",
+ domain)));
+
+ final Category category = categoryRepo
+ .findByPath(pages.getCategoryDomain(), page)
+ .orElseThrow(() -> new NotFoundException(String.format(
"No page for path \"%s\" in site \"%s\"",
page,
- siteName)));
+ domain)));
+
+
// ToDo Get PageModelBuilder
// ToDo Build page
// ToDo Get Theme Processor
// ToDo Pass page to theme processor
// ToDo Return result of ThemeProcessor
+ throw new UnsupportedOperationException();
+ }
+
+ @Path("/{name}.{lang}.html")
+ public String getPage(
+ @Context final UriInfo uriInfo,
+ @PathParam("page") final String page,
+ @PathParam("lang") final String language,
+ @QueryParam("theme") @DefaultValue("--DEFAULT--") final String theme) {
throw new UnsupportedOperationException();
-
}
}
diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageBuilder.java b/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageBuilder.java
index 1f5866335..5e1f7e4d3 100644
--- a/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageBuilder.java
+++ b/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageBuilder.java
@@ -29,9 +29,6 @@ import java.util.Optional;
* interface providing some functionality needed by all implementations of the
* {@link PageBuilder} interface.
*
- * @param
Generics variable for the class which represents the page created
- * by the {@link PageBuilder}.
- *
* @author Jens Pelzetter
*
*/
@@ -47,18 +44,23 @@ public abstract class AbstractPageBuilder implements PageBuilder {
* the component objects created by the {@link ComponentBuilder}s are added
* to the page.
*
- * @param pageModel The {@link PageModel\ to process.
+ * @param pageModel The {@link PageModel} to process.
+ * @param parameters Parameters provided by application which wants to
+ * render a {@link PageModel}. The parameters are passed
+ * the {@link ComponentBuilder}s.
*
* @return A page containing all components from the {@link PageModel}.
*/
@Override
- public Map buildPage(final PageModel pageModel) {
-
- final Map page = buildPage();
+ public Map buildPage(final PageModel pageModel,
+ final Map parameters) {
+
+ final Map page = buildPage(parameters);
for (final ComponentModel componentModel : pageModel.getComponents()) {
final Optional