diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/CategorizedItemComponentRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/CategorizedItemComponentRenderer.java
index 9dfe632a3..4196d02ff 100644
--- a/ccm-cms/src/main/java/org/librecms/pagemodel/CategorizedItemComponentRenderer.java
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/CategorizedItemComponentRenderer.java
@@ -41,7 +41,7 @@ import javax.ws.rs.NotFoundException;
import static org.librecms.pages.PagesConstants.*;
-import org.libreccm.pagemodel.RendersComponentModel;
+import org.libreccm.pagemodel.RendersComponent;
/**
* Renderer for the {@link CategorizedItemComponent}.
@@ -49,7 +49,7 @@ import org.libreccm.pagemodel.RendersComponentModel;
* @author Jens Pelzetter
*/
@RequestScoped
-@RendersComponentModel(componentModel = CategorizedItemComponent.class)
+@RendersComponent(componentModel = CategorizedItemComponent.class)
public class CategorizedItemComponentRenderer
extends AbstractContentItemComponentRenderer {
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/CategoryTreeComponentRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/CategoryTreeComponentRenderer.java
index 29ea4971c..edd2c9293 100644
--- a/ccm-cms/src/main/java/org/librecms/pagemodel/CategoryTreeComponentRenderer.java
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/CategoryTreeComponentRenderer.java
@@ -40,7 +40,7 @@ import javax.transaction.Transactional;
import static org.librecms.pages.PagesConstants.*;
import org.libreccm.pagemodel.ComponentRenderer;
-import org.libreccm.pagemodel.RendersComponentModel;
+import org.libreccm.pagemodel.RendersComponent;
/**
* Renderer for the {@link CategoryTreeComponent}.
@@ -48,7 +48,7 @@ import org.libreccm.pagemodel.RendersComponentModel;
* @author Jens Pelzetter
*/
@RequestScoped
-@RendersComponentModel(componentModel = CategoryTreeComponent.class)
+@RendersComponent(componentModel = CategoryTreeComponent.class)
public class CategoryTreeComponentRenderer
implements ComponentRenderer {
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/FixedContentItemComponentRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/FixedContentItemComponentRenderer.java
index ad0839d93..4cc92d1bc 100644
--- a/ccm-cms/src/main/java/org/librecms/pagemodel/FixedContentItemComponentRenderer.java
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/FixedContentItemComponentRenderer.java
@@ -28,7 +28,7 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.NotFoundException;
-import org.libreccm.pagemodel.RendersComponentModel;
+import org.libreccm.pagemodel.RendersComponent;
/**
* Renderer for the {@link FixedContentItemComponent}.
@@ -36,7 +36,7 @@ import org.libreccm.pagemodel.RendersComponentModel;
* @author Jens Pelzetter
*/
@RequestScoped
-@RendersComponentModel(componentModel = FixedContentItemComponent.class)
+@RendersComponent(componentModel = FixedContentItemComponent.class)
public class FixedContentItemComponentRenderer
extends AbstractContentItemComponentRenderer {
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/GreetingItemComponentRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/GreetingItemComponentRenderer.java
index fd1b32259..a7993be12 100644
--- a/ccm-cms/src/main/java/org/librecms/pagemodel/GreetingItemComponentRenderer.java
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/GreetingItemComponentRenderer.java
@@ -34,7 +34,7 @@ import javax.ws.rs.NotFoundException;
import static org.librecms.pages.PagesConstants.*;
-import org.libreccm.pagemodel.RendersComponentModel;
+import org.libreccm.pagemodel.RendersComponent;
/**
* Renderer for the {@link GreetingItemComponent}.
@@ -42,7 +42,7 @@ import org.libreccm.pagemodel.RendersComponentModel;
* @author Jens Pelzetter
*/
@RequestScoped
-@RendersComponentModel(componentModel = GreetingItemComponent.class)
+@RendersComponent(componentModel = GreetingItemComponent.class)
public class GreetingItemComponentRenderer
extends AbstractContentItemComponentRenderer {
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/ItemListComponentRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/ItemListComponentRenderer.java
index 29e029180..02f5f5653 100644
--- a/ccm-cms/src/main/java/org/librecms/pagemodel/ItemListComponentRenderer.java
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/ItemListComponentRenderer.java
@@ -53,7 +53,7 @@ import javax.servlet.http.HttpServletRequest;
import static org.librecms.pages.PagesConstants.*;
-import org.libreccm.pagemodel.RendersComponentModel;
+import org.libreccm.pagemodel.RendersComponent;
/**
* Renderer for the {@link ItemListComponent}.
@@ -61,7 +61,7 @@ import org.libreccm.pagemodel.RendersComponentModel;
* @author Jens Pelzetter
*/
@RequestScoped
-@RendersComponentModel(componentModel = ItemListComponent.class)
+@RendersComponent(componentModel = ItemListComponent.class)
public class ItemListComponentRenderer
implements ComponentRenderer {
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 19c5d3306..f851e770f 100644
--- a/ccm-cms/src/main/java/org/librecms/pages/PagesManager.java
+++ b/ccm-cms/src/main/java/org/librecms/pages/PagesManager.java
@@ -59,7 +59,7 @@ public class PagesManager implements Serializable {
pages.setCategoryDomain(domain);
pagesRepo.save(pages);
- siteManager.addApplicationToSite(site, pages);
+ siteManager.addApplicationToSite(pages, site);
return pages;
}
diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesController.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesController.java
index 80184e990..74acc6e77 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesController.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesController.java
@@ -30,7 +30,8 @@ import javax.inject.Inject;
import javax.transaction.Transactional;
/**
- *
+ * Controller for the Admin UI for {@link Site}s.
+ *
* @author Jens Pelzetter
*/
@RequestScoped
@@ -41,6 +42,12 @@ class SitesController implements Serializable {
@Inject
private SiteRepository sitesRepo;
+ /**
+ * Find all sites and transform into {@link SitesTableRow} objects. Also takes
+ * care of loading are required lazily fetched properties.
+ *
+ * @return A list with the data about all available {@link Site}s.
+ */
@Transactional(Transactional.TxType.REQUIRED)
protected List findSites() {
diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesForm.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesForm.java
index 30c539761..d89f3cc8b 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesForm.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesForm.java
@@ -49,7 +49,8 @@ import java.util.TooManyListenersException;
import static com.arsdigita.ui.admin.AdminUiConstants.*;
/**
- *
+ * Form for editing/creating a {@link Site}.
+ *
* @author Jens Pelzetter
*/
class SitesForm extends Form {
diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTab.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTab.java
index 915f9158c..0fcd39b41 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTab.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTab.java
@@ -30,7 +30,8 @@ import com.arsdigita.toolbox.ui.LayoutPanel;
import static com.arsdigita.ui.admin.AdminUiConstants.*;
/**
- *
+ * Tab for {@code /ccm/admin} containing the Admin UI for {@link Site}s.
+ *
* @author Jens Pelzetter
*/
public class SitesTab extends LayoutPanel {
diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTable.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTable.java
index 419ee4bdb..79bdfffee 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTable.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTable.java
@@ -44,7 +44,9 @@ import java.util.List;
import static com.arsdigita.ui.admin.AdminUiConstants.*;
/**
- *
+ * Table which displays data about all available {@link Site}s and provides
+ * links for editing and deleting them.
+ *
* @author Jens Pelzetter
*/
class SitesTable extends Table {
diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTableRow.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTableRow.java
index 3facc9900..010d271fd 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTableRow.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTableRow.java
@@ -24,7 +24,8 @@ import java.util.Collections;
import java.util.List;
/**
- *
+ * Contains all data for one row of the {@link SitesTable}.
+ *
* @author Jens Pelzetter
*/
class SitesTableRow implements Comparable, Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentRendererManager.java b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentRendererManager.java
index 688a3fb9a..75789cf99 100644
--- a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentRendererManager.java
+++ b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentRendererManager.java
@@ -92,11 +92,11 @@ public class ComponentRendererManager {
}
/**
- * Annotation literal for the {@link RendersComponentModel} annotation.
+ * Annotation literal for the {@link RendersComponent} annotation.
*/
private static class ComponentModelTypeLiteral
- extends AnnotationLiteral
- implements RendersComponentModel {
+ extends AnnotationLiteral
+ implements RendersComponent {
private static final long serialVersionUID = -2601632434295178600L;
diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/RendersComponentModel.java b/ccm-core/src/main/java/org/libreccm/pagemodel/RendersComponent.java
similarity index 96%
rename from ccm-core/src/main/java/org/libreccm/pagemodel/RendersComponentModel.java
rename to ccm-core/src/main/java/org/libreccm/pagemodel/RendersComponent.java
index ab6590538..7f0aeca9c 100644
--- a/ccm-core/src/main/java/org/libreccm/pagemodel/RendersComponentModel.java
+++ b/ccm-core/src/main/java/org/libreccm/pagemodel/RendersComponent.java
@@ -33,7 +33,7 @@ import java.lang.annotation.Target;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
-public @interface RendersComponentModel {
+public @interface RendersComponent {
Class extends ComponentModel> componentModel();
diff --git a/ccm-core/src/main/java/org/libreccm/sites/Site.java b/ccm-core/src/main/java/org/libreccm/sites/Site.java
index af0021793..b467707fd 100644
--- a/ccm-core/src/main/java/org/libreccm/sites/Site.java
+++ b/ccm-core/src/main/java/org/libreccm/sites/Site.java
@@ -21,6 +21,7 @@ package org.libreccm.sites;
import static org.libreccm.core.CoreConstants.*;
import org.libreccm.core.CcmObject;
+import org.libreccm.theming.Themes;
import java.util.ArrayList;
import java.util.Collections;
@@ -35,6 +36,7 @@ import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
+ * An entity for storing the data about a site/virtual host.
*
* @author Jens Pelzetter
*/
@@ -50,7 +52,9 @@ import javax.persistence.Table;
,
@NamedQuery(
name = "Site.findDefaultSite",
- query = "SELECT s FROM Site s WHERE s.defaultSite = true"
+ query = "SELECT s FROM Site s "
+ + "WHERE s.defaultSite = true "
+ + "ORDER BY s.domain"
)
,
@NamedQuery(
@@ -63,15 +67,32 @@ public class Site extends CcmObject {
private static final long serialVersionUID = 7993361616050713139L;
+ /**
+ * The domain of the site, e.g. {@code www.example.org}.
+ */
@Column(name = "DOMAIN_OF_SITE", unique = true)
private String domainOfSite;
+ /**
+ * A boolean indicating that the instance is the default site to use if
+ * there is no site with a matching domain.
+ */
@Column(name = "DEFAULT_SITE")
private boolean defaultSite;
+ /**
+ * The name of the default theme for the site. The default theme is used
+ * when no specific theme is requested. We can't use a reference to some
+ * entity here because not all themes have a representation in the database.
+ *
+ * @see Themes
+ */
@Column(name = "DEFAULT_THEME")
private String defaultTheme;
+ /**
+ * The applications mapped to this site.
+ */
@OneToMany(mappedBy = "site")
private List applications;
diff --git a/ccm-core/src/main/java/org/libreccm/sites/SiteAwareApplication.java b/ccm-core/src/main/java/org/libreccm/sites/SiteAwareApplication.java
index acea753d2..1dfe4121f 100644
--- a/ccm-core/src/main/java/org/libreccm/sites/SiteAwareApplication.java
+++ b/ccm-core/src/main/java/org/libreccm/sites/SiteAwareApplication.java
@@ -31,6 +31,16 @@ import javax.persistence.ManyToOne;
import javax.persistence.Table;
/**
+ * A subtype of {@link CcmApplication} which can be associated with a
+ * {@link Site}.
+ *
+ * Only applications which are different for each site should extend this class.
+ * For example for the Admin application or the Content Center application
+ * provided by the ccm-cms module it makes to sense to make them site aware.
+ * This applications are used to manage objects which are shared by all sites.
+ * Other applications like the Pages application provided by ccm-cms module are
+ * of course site aware. The Pages application for example manages the page tree
+ * of one specific site.
*
* @author Jens Pelzetter
*/
@@ -40,6 +50,9 @@ public class SiteAwareApplication extends CcmApplication {
private static final long serialVersionUID = -8892544588904174406L;
+ /**
+ * The {@link Site} with which the application is associated.
+ */
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "SITE_ID")
private Site site;
diff --git a/ccm-core/src/main/java/org/libreccm/sites/SiteManager.java b/ccm-core/src/main/java/org/libreccm/sites/SiteManager.java
index fd609235e..e07c56e6b 100644
--- a/ccm-core/src/main/java/org/libreccm/sites/SiteManager.java
+++ b/ccm-core/src/main/java/org/libreccm/sites/SiteManager.java
@@ -30,6 +30,7 @@ import javax.inject.Inject;
import javax.transaction.Transactional;
/**
+ * Manages {@link Site} entities.
*
* @author Jens Pelzetter
*/
@@ -40,30 +41,43 @@ public class SiteManager implements Serializable {
@Inject
private ApplicationRepository applicationRepo;
-
+
@Inject
private SiteRepository siteRepo;
+ /**
+ * Adds an instance of {@link SiteAwareApplication} to a {@link Site}.
+ *
+ * @param application The application to associate with the site.
+ * @param site The site to which the application instance is added.
+ */
@RequiresPrivilege(PRIVILEGE_ADMIN)
@Transactional(Transactional.TxType.REQUIRED)
- public void addApplicationToSite(final Site site,
- final SiteAwareApplication application) {
-
+ public void addApplicationToSite(final SiteAwareApplication application,
+ final Site site) {
+
site.addApplication(application);
application.setSite(site);
-
+
siteRepo.save(site);
applicationRepo.save(application);
}
-
+
+ /**
+ * Removes an application from a site. The application instance is
+ * not deleted!
+ *
+ * @param application The application to remove from the site.
+ * @param site The site from which the application is removed.
+ */
@RequiresPrivilege(PRIVILEGE_ADMIN)
@Transactional(Transactional.TxType.REQUIRED)
- public void removeApplicationFromSite(final Site site,
- final SiteAwareApplication application) {
-
+ public void removeApplicationFromSite(final SiteAwareApplication application,
+ final Site site) {
+
site.removeApplication(application);
application.setSite(null);
-
+
siteRepo.save(site);
applicationRepo.save(application);
}
diff --git a/ccm-core/src/main/java/org/libreccm/sites/SiteRepository.java b/ccm-core/src/main/java/org/libreccm/sites/SiteRepository.java
index 724c29b6d..0bc070b69 100644
--- a/ccm-core/src/main/java/org/libreccm/sites/SiteRepository.java
+++ b/ccm-core/src/main/java/org/libreccm/sites/SiteRepository.java
@@ -22,6 +22,7 @@ import org.libreccm.core.AbstractEntityRepository;
import org.libreccm.core.CoreConstants;
import org.libreccm.security.RequiresPrivilege;
+import java.util.List;
import java.util.Optional;
import java.util.UUID;
@@ -31,6 +32,7 @@ import javax.persistence.TypedQuery;
import javax.transaction.Transactional;
/**
+ * Repository for {@link Site} entities.
*
* @author Jens Pelzetter
*/
@@ -39,6 +41,16 @@ public class SiteRepository extends AbstractEntityRepository {
private static final long serialVersionUID = 3120528987720524155L;
+ /**
+ * Retrieve the {@link Site} for a specific domain.
+ *
+ * @param domain The domain of site to retrieve.
+ *
+ * @return If there is a {@link Site} for the provided domain an
+ * {@link Optional} containing the {@link Site} is returned. If
+ * there is not matching {@link Site} an empty {@link Optional} is
+ * returned.
+ */
@Transactional(Transactional.TxType.REQUIRED)
public Optional findByDomain(final String domain) {
@@ -53,18 +65,36 @@ public class SiteRepository extends AbstractEntityRepository {
}
}
+ /**
+ * Finds the default site.
+ *
+ * @return An {@link Optional} containing the default site. If there is no
+ * default site an empty {@link Optional} is returned. If there
+ * multiple {@link Site}s marked as default site (which should not
+ * happen) the first result is returned (the list is ordered by the
+ * domain).
+ */
@Transactional(Transactional.TxType.REQUIRED)
public Optional findDefaultSite() {
final TypedQuery query = getEntityManager()
.createNamedQuery("Site.findDefaultSite", Site.class);
- try {
- return Optional.of(query.getSingleResult());
- } catch (NoResultException ex) {
+ final List result = query.getResultList();
+ if (result.isEmpty()) {
return Optional.empty();
+ } else {
+ return Optional.of(result.get(0));
}
}
+ /**
+ * Checks if there is a {@link Site} for a domain.
+ *
+ * @param domain The domain to check for.
+ *
+ * @return {@code true} if there is a {@link Site} for that domain,
+ * {@code false} otherwise.
+ */
@Transactional(Transactional.TxType.REQUIRED)
public boolean hasSiteForDomain(final String domain) {
@@ -97,7 +127,7 @@ public class SiteRepository extends AbstractEntityRepository {
public boolean isNew(final Site site) {
return site.getObjectId() == 0;
}
-
+
@Override
public void initNewEntity(final Site site) {
site.setUuid(UUID.randomUUID().toString());
diff --git a/ccm-core/src/main/java/org/libreccm/sites/package-info.java b/ccm-core/src/main/java/org/libreccm/sites/package-info.java
new file mode 100644
index 000000000..c9dd27ab4
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/sites/package-info.java
@@ -0,0 +1,30 @@
+/*
+ * 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
+ */
+/**
+ * This packages provides several classes for managing sites or virtual hosts
+ * in CCM. In some way this replaces the old Subsite module which was available
+ * for previous versions. On the other hand there are several differences.
+ *
+ * The most important difference is that the classes in this package do not hook
+ * into the request/response cycle
+ * like the old Subsite module. Instead a subclass of {@link CcmApplication}
+ * class ({@link SiteAwareApplication}) is provided. The application itself is
+ * responsible for interpreting the site specific parts.
+ */
+package org.libreccm.sites;