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 204cd7c80..80184e990 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
@@ -48,6 +48,7 @@ class SitesController implements Serializable {
.findAll()
.stream()
.map(this::buildRow)
+ .sorted()
.collect(Collectors.toList());
}
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 9683d7c53..3e53aad4a 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
@@ -112,6 +112,9 @@ public class SitesForm extends Form {
super.add(defaultSiteCheckbox);
defaultThemeSelect = new SingleSelect(THEME_SELECT);
+ defaultThemeSelect.setLabel(new GlobalizedMessage(
+ "ui.admin.sites.default_theme",
+ ADMIN_BUNDLE));
try {
defaultThemeSelect.addPrintListener(event -> {
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 45fd948c7..3facc9900 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
@@ -27,7 +27,7 @@ import java.util.List;
*
* @author Jens Pelzetter
*/
-class SitesTableRow implements Serializable {
+class SitesTableRow implements Comparable, Serializable {
private static final long serialVersionUID = -8913595737414248135L;
@@ -98,5 +98,10 @@ class SitesTableRow implements Serializable {
protected void addApplication(final String application) {
applications.add(application);
}
+
+ @Override
+ public int compareTo(final SitesTableRow other) {
+ return domainOfSite.compareTo(other.getDomainOfSite());
+ }
}
diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java
index 1e1404a41..06a81873c 100644
--- a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java
+++ b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java
@@ -56,7 +56,7 @@ public class AdminView extends CustomComponent implements View {
private final JpqlConsole jpqlConsole;
private final ConfigurationTab configurationTab;
-
+
private final SystemInformationTab sysInfoTab;
@Inject
@@ -75,7 +75,7 @@ public class AdminView extends CustomComponent implements View {
tabUsersGroupsRoles = tabSheet
.addTab(usersGroupsRoles,
bundle.getString("ui.admin.tab.users_groups_roles.title"));
-
+
final ServletContext servletContext = VaadinServlet
.getCurrent()
.getServletContext();
@@ -86,12 +86,15 @@ public class AdminView extends CustomComponent implements View {
jpqlConsole = null;
}
+ final SitesTab sitesTab = new SitesTab(controller);
+ tabSheet.addTab(sitesTab, "Sites");
+
configurationTab = new ConfigurationTab();
tabSheet.addTab(configurationTab, "Configuration");
sysInfoTab = new SystemInformationTab(controller);
tabSheet.addTab(sysInfoTab, "System Information");
-
+
final CssLayout footer = new CssLayout();
footer.setHeight("5em");
@@ -104,7 +107,4 @@ public class AdminView extends CustomComponent implements View {
super.setCompositionRoot(viewLayout);
}
-
-
-
}
diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminViewController.java b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminViewController.java
index 24a2ba6e1..3ff397497 100644
--- a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminViewController.java
+++ b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminViewController.java
@@ -45,6 +45,9 @@ class AdminViewController implements Serializable {
@Inject
private JpqlConsoleController jpqlConsoleController;
+ @Inject
+ private SitesController sitesController;
+
@Inject
private UsersGroupsRolesController usersGroupsRolesController;
@@ -64,6 +67,10 @@ class AdminViewController implements Serializable {
return jpqlConsoleController;
}
+ protected SitesController getSitesController() {
+ return sitesController;
+ }
+
protected UsersGroupsRolesController getUsersGroupsRolesController() {
return usersGroupsRolesController;
}
diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SiteEditor.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SiteEditor.java
new file mode 100644
index 000000000..7e132975f
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SiteEditor.java
@@ -0,0 +1,167 @@
+/*
+ * 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.libreccm.admin.ui;
+
+import com.arsdigita.ui.admin.AdminUiConstants;
+
+import com.vaadin.server.UserError;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.FormLayout;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.NativeSelect;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Window;
+import org.libreccm.l10n.LocalizedTextsUtil;
+import org.libreccm.sites.Site;
+import org.libreccm.theming.ThemeInfo;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+class SiteEditor extends Window {
+
+ private static final long serialVersionUID = 7016158691791408762L;
+
+ private final Site site;
+ private final AdminViewController controller;
+
+ private boolean dataHasChanged = false;
+
+ public SiteEditor(final AdminViewController controller) {
+ super();
+
+ this.site = null;
+ this.controller = controller;
+
+ addWidgets();
+ }
+
+ public SiteEditor(final Site site, final AdminViewController controller) {
+
+ super();
+
+ this.site = site;
+ this.controller = controller;
+
+ addWidgets();
+ }
+
+ private void addWidgets() {
+
+ final LocalizedTextsUtil adminTextsUtil = controller
+ .getGlobalizationHelper()
+ .getLocalizedTextsUtil(AdminUiConstants.ADMIN_BUNDLE);
+
+ if (site == null) {
+ setCaption(adminTextsUtil.getText("ui.admin.sites.create_new"));
+ } else {
+ setCaption(adminTextsUtil.getText("ui.admin.sites.edit"));
+ }
+
+ final TextField domainOfSiteField = new TextField(
+ adminTextsUtil.getText("ui.admin.sites.domain_of_site"));
+ domainOfSiteField.addValueChangeListener(event -> {
+ dataHasChanged = true;
+ });
+
+ final CheckBox isDefaultSiteCheckBox = new CheckBox(
+ adminTextsUtil.getText("ui.admin.sites.is_default_site"));
+ isDefaultSiteCheckBox.addValueChangeListener(event -> {
+ dataHasChanged = true;
+ });
+
+ final List themes = controller
+ .getSitesController()
+ .getThemes()
+ .getAvailableThemes()
+ .stream()
+ .map(ThemeInfo::getName)
+ .collect(Collectors.toList());
+
+ final NativeSelect defaultThemeSelect = new NativeSelect<>(
+ adminTextsUtil.getText("ui.admin.sites.default_theme"), themes);
+ defaultThemeSelect.addValueChangeListener(event -> {
+ dataHasChanged = true;
+ });
+
+ final Button saveButton = new Button();
+ if (site == null) {
+ saveButton.setCaption(adminTextsUtil.getText(
+ "ui.admin.sites.buttons.save.create"));
+ } else {
+ saveButton.setCaption(adminTextsUtil.getText(
+ "ui.admin.sites.buttons.save.changed"));
+ }
+ saveButton.addClickListener(event -> {
+ if (dataHasChanged) {
+
+ final String domainOfSite = domainOfSiteField.getValue();
+ if (domainOfSite == null
+ || domainOfSite.isEmpty()
+ || domainOfSite.matches("\\s*")) {
+
+ domainOfSiteField.setComponentError(new UserError(
+ adminTextsUtil.getText(
+ "ui.admin.sites.domain_of_site.error.empty")));
+ return;
+ }
+
+ if (!controller.getSitesController().isUnique(domainOfSite)) {
+ domainOfSiteField.setComponentError(new UserError(
+ adminTextsUtil.getText(
+ "ui.admin.sites.domain_of_site.error.not_unique")));
+ return;
+ }
+
+ site.setDomainOfSite(domainOfSite);
+ site.setDefaultSite(isDefaultSiteCheckBox.getValue());
+ site.setDefaultTheme(defaultThemeSelect.getValue());
+
+ controller
+ .getSitesController()
+ .getSiteRepository()
+ .save(site);
+ controller
+ .getSitesController()
+ .getSitesTableDataProvider()
+ .refreshAll();
+ close();
+ }
+ });
+
+ final Button cancelButton = new Button(adminTextsUtil
+ .getText("ui.admin.sites.buttons.cancel"));
+ cancelButton.addClickListener(event -> {
+ close();
+ });
+
+ super.setContent(new VerticalLayout(
+ new FormLayout(domainOfSiteField,
+ isDefaultSiteCheckBox,
+ defaultThemeSelect),
+ new HorizontalLayout(saveButton, cancelButton)));
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SitesController.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesController.java
new file mode 100644
index 000000000..e7a3f415e
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesController.java
@@ -0,0 +1,87 @@
+/*
+ * 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.libreccm.admin.ui;
+
+import com.vaadin.cdi.ViewScoped;
+import org.libreccm.sites.Site;
+import org.libreccm.sites.SiteRepository;
+import org.libreccm.theming.Themes;
+
+import java.io.Serializable;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@ViewScoped
+class SitesController implements Serializable {
+
+ private static final long serialVersionUID = 112502641827852807L;
+
+ @Inject
+ private SiteRepository siteRepository;
+
+ @Inject
+ private SitesTableDataProvider sitesTableDataProvider;
+
+ @Inject
+ private Themes themes;
+
+ protected SitesTableDataProvider getSitesTableDataProvider() {
+ return sitesTableDataProvider;
+ }
+
+ protected Themes getThemes() {
+ return themes;
+ }
+
+ protected SiteRepository getSiteRepository() {
+ return siteRepository;
+ }
+
+ /**
+ * Check if there no site with the provided domain.
+ *
+ * @param domainOfSite
+ *
+ * @return {@code true} if there is no site with the provided domain,
+ * {@code false} otherwise.
+ */
+ @Transactional(Transactional.TxType.REQUIRED)
+ protected boolean isUnique(final String domainOfSite) {
+
+ return !siteRepository.findByDomain(domainOfSite).isPresent();
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ protected void delete(final long siteId) {
+ final Site site = siteRepository
+ .findById(siteId)
+ .orElseThrow(() -> new IllegalArgumentException(String
+ .format("No site with ID %d in the database.",
+ siteId)));
+ siteRepository.delete(site);
+ sitesTableDataProvider.refreshAll();
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTab.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTab.java
new file mode 100644
index 000000000..198b00505
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTab.java
@@ -0,0 +1,169 @@
+/*
+ * 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.libreccm.admin.ui;
+
+import com.arsdigita.ui.admin.AdminUiConstants;
+
+import com.vaadin.icons.VaadinIcons;
+import com.vaadin.shared.ui.ContentMode;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.CustomComponent;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.components.grid.HeaderCell;
+import com.vaadin.ui.components.grid.HeaderRow;
+import com.vaadin.ui.themes.ValoTheme;
+import org.libreccm.cdi.utils.CdiUtil;
+import org.libreccm.l10n.LocalizedTextsUtil;
+import org.libreccm.sites.Site;
+import org.libreccm.ui.ConfirmDialog;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+class SitesTab extends CustomComponent {
+
+ private static final long serialVersionUID = 9188476373782633282L;
+
+ private static final String COL_DOMAIN_OF_SITE = "domain_of_site";
+ private static final String COL_IS_DEFAULT_SITE = "is_default_site";
+ private static final String COL_DEFAULT_THEME = "default_theme";
+ private static final String COL_APPLICATIONS = "applications";
+ private static final String COL_EDIT = "edit";
+ private static final String COL_DELETE = "delete";
+
+ protected SitesTab(final AdminViewController adminViewController) {
+
+ super();
+
+ final LocalizedTextsUtil adminTextsUtil = adminViewController
+ .getGlobalizationHelper()
+ .getLocalizedTextsUtil(AdminUiConstants.ADMIN_BUNDLE);
+
+ final SitesController controller = adminViewController
+ .getSitesController();
+
+ final Grid sitesGrid = new Grid<>();
+ sitesGrid
+ .addColumn(SitesTableRowData::getDomainOfSite)
+ .setCaption(adminTextsUtil.getText(
+ "ui.admin.sites.table.columns.domain.header"))
+ .setId(COL_DOMAIN_OF_SITE);
+ sitesGrid
+ .addColumn(SitesTableRowData::isDefaultSite)
+ .setCaption(adminTextsUtil.getText(
+ "ui.admin.sites.table.columns.default_site.header"))
+ .setId(COL_IS_DEFAULT_SITE);
+ sitesGrid
+ .addColumn(SitesTableRowData::getDefaultTheme)
+ .setCaption(adminTextsUtil.getText(
+ "ui.admin.sites.table.columns.default_theme.header"))
+ .setId(COL_DEFAULT_THEME);
+ sitesGrid
+ .addComponentColumn(row -> {
+ return new Label(String.join("\n",
+ row.getApplications()),
+ ContentMode.PREFORMATTED);
+ })
+ .setCaption(adminTextsUtil
+ .getText("ui.admin.sites.table.columns.applications.header"))
+ .setId(COL_APPLICATIONS);
+ sitesGrid
+ .addComponentColumn(row -> {
+ final Button editButton = new Button(adminTextsUtil
+ .getText("ui.admin.sites.table.buttons.edit"),
+ VaadinIcons.EDIT);
+ editButton.addClickListener(event -> {
+ final Site site = adminViewController
+ .getSitesController()
+ .getSiteRepository()
+ .findById(row.getSiteId())
+ .orElseThrow(() -> new IllegalArgumentException(String
+ .format("No Site with ID %d in the database.",
+ row.getSiteId())));
+ final SiteEditor editor = new SiteEditor(
+ site, adminViewController);
+ editor.center();
+ editor.setWidth("66%");
+ editor.setHeight("80%");
+ UI.getCurrent().addWindow(editor);
+ });
+ editButton.addStyleName(ValoTheme.BUTTON_TINY);
+
+ return editButton;
+ })
+ .setId(COL_EDIT);
+ sitesGrid
+ .addComponentColumn(row -> {
+ if (row.isDeletable()) {
+ final Button deleteButton = new Button(adminTextsUtil
+ .getText("ui.admin.sites.table.buttons.delete"),
+ VaadinIcons.EDIT);
+ deleteButton.addClickListener(event -> {
+
+ final ConfirmDialog dialog = new ConfirmDialog(() -> {
+ adminViewController
+ .getSitesController()
+ .delete(row.getSiteId());
+
+ return null;
+ });
+ });
+ deleteButton.addStyleNames(ValoTheme.BUTTON_TINY,
+ ValoTheme.BUTTON_DANGER);
+
+ return deleteButton;
+ } else {
+ return new Label("");
+ }
+ })
+ .setId(COL_DELETE);
+ final HeaderRow headerRow = sitesGrid.prependHeaderRow();
+ final HeaderCell headerCell = headerRow.join(COL_DOMAIN_OF_SITE,
+ COL_IS_DEFAULT_SITE,
+ COL_DEFAULT_THEME,
+ COL_APPLICATIONS,
+ COL_EDIT,
+ COL_DELETE);
+ final Button newSiteButton = new Button(adminTextsUtil
+ .getText("ui.admin.sites.add_new_site_link"),
+ VaadinIcons.PLUS_CIRCLE_O);
+ newSiteButton.addStyleName(ValoTheme.BUTTON_TINY);
+ newSiteButton.addClickListener(event -> {
+ final SiteEditor editor = new SiteEditor(adminViewController);
+ editor.center();
+ editor.setWidth("66%");
+ editor.setHeight("80%");
+ UI.getCurrent().addWindow(editor);
+ });
+ final HorizontalLayout headerLayout
+ = new HorizontalLayout(newSiteButton);
+ headerCell.setComponent(headerLayout);
+ sitesGrid.setDataProvider(adminViewController
+ .getSitesController()
+ .getSitesTableDataProvider());
+ sitesGrid.setWidth("100%");
+
+ super.setCompositionRoot(sitesGrid);
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableDataProvider.java
new file mode 100644
index 000000000..654f9003a
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableDataProvider.java
@@ -0,0 +1,149 @@
+/*
+ * 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.libreccm.admin.ui;
+
+import com.vaadin.cdi.ViewScoped;
+import com.vaadin.data.provider.AbstractDataProvider;
+import com.vaadin.data.provider.Query;
+import org.libreccm.sites.Site;
+import org.libreccm.sites.SiteRepository;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+import javax.transaction.Transactional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@ViewScoped
+public class SitesTableDataProvider
+ // extends AbstractBackEndDataProvider {
+ extends AbstractDataProvider {
+
+ private static final long serialVersionUID = 2696603483924152498L;
+
+ @Inject
+ private EntityManager entityManager;
+
+ @Inject
+ private SiteRepository siteRepository;
+
+// @Override
+// @Transactional(Transactional.TxType.REQUIRED)
+// public Stream fetchFromBackEnd(
+// final Query query) {
+//
+// final CriteriaBuilder criteriaBuilder = entityManager
+// .getCriteriaBuilder();
+// final CriteriaQuery criteriaQuery = criteriaBuilder
+// .createQuery(Site.class);
+// final Root from = criteriaQuery.from(Site.class);
+//
+// criteriaQuery.orderBy(criteriaBuilder.asc(from.get("domainOfSite")));
+//
+// return entityManager
+// .createQuery(criteriaQuery)
+// .setFirstResult(query.getOffset())
+// .setMaxResults(query.getLimit())
+// .getResultList()
+// .stream()
+// .map(this::buildRow);
+// }
+//
+// @Transactional(Transactional.TxType.REQUIRED)
+// @Override
+// public int sizeInBackEnd(final Query query) {
+//
+// return siteRepository.findAll().size();
+// }
+ private SitesTableRowData buildRow(final Site site) {
+
+ final SitesTableRowData row = new SitesTableRowData();
+
+ row.setSiteId(site.getObjectId());
+ row.setDomainOfSite(site.getDomainOfSite());
+ row.setDefaultSite(site.isDefaultSite());
+ row.setDefaultTheme(site.getDefaultTheme());
+ row.setDeletable(site.getApplications().isEmpty());
+
+ final List applications = site
+ .getApplications()
+ .stream()
+ .map(application -> application.getPrimaryUrl())
+ .collect(Collectors.toList());
+
+ row.setApplications(applications);
+ return row;
+ }
+
+ @Override
+ public boolean isInMemory() {
+ return false;
+ }
+
+ @Override
+ public int size(final Query query) {
+ return siteRepository.findAll().size();
+ }
+
+ @Override
+ @Transactional(Transactional.TxType.REQUIRED)
+ public Stream fetch(
+ final Query query) {
+
+ final CriteriaBuilder criteriaBuilder = entityManager
+ .getCriteriaBuilder();
+ final CriteriaQuery criteriaQuery = criteriaBuilder
+ .createQuery(Site.class);
+ final Root from = criteriaQuery.from(Site.class);
+
+ criteriaQuery.orderBy(criteriaBuilder.asc(from.get("domainOfSite")));
+
+ final List sites = entityManager
+ .createQuery(criteriaQuery)
+ .setFirstResult(query.getOffset())
+ .setMaxResults(query.getLimit())
+ .getResultList();
+ final List rows = new ArrayList<>();
+ for (final Site site : sites) {
+ final SitesTableRowData row = buildRow(site);
+ rows.add(row);
+ }
+
+ return rows.stream();
+
+// return entityManager
+// .createQuery(criteriaQuery)
+// .setFirstResult(query.getOffset())
+// .setMaxResults(query.getLimit())
+// .getResultList()
+// .stream()
+// .map(this::buildRow);
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableRowData.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableRowData.java
new file mode 100644
index 000000000..7fb8c9b4e
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableRowData.java
@@ -0,0 +1,107 @@
+/*
+ * 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.libreccm.admin.ui;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class SitesTableRowData implements Comparable, Serializable {
+
+ private static final long serialVersionUID = 4023882563583816258L;
+
+ private long siteId;
+
+ private String domainOfSite;
+
+ private boolean defaultSite;
+
+ private String defaultTheme;
+
+ private boolean deletable;
+
+ private List applications;
+
+ protected SitesTableRowData() {
+ applications = new ArrayList<>();
+ }
+
+ public long getSiteId() {
+ return siteId;
+ }
+
+ public void setSiteId(final long siteId) {
+ this.siteId = siteId;
+ }
+
+ public String getDomainOfSite() {
+ return domainOfSite;
+ }
+
+ public void setDomainOfSite(final String domainOfSite) {
+ this.domainOfSite = domainOfSite;
+ }
+
+ public boolean isDefaultSite() {
+ return defaultSite;
+ }
+
+ public void setDefaultSite(final boolean defaultSite) {
+ this.defaultSite = defaultSite;
+ }
+
+ public String getDefaultTheme() {
+ return defaultTheme;
+ }
+
+ public void setDefaultTheme(final String defaultTheme) {
+ this.defaultTheme = defaultTheme;
+ }
+
+ public boolean isDeletable() {
+ return deletable;
+ }
+
+ public void setDeletable(final boolean deletable) {
+ this.deletable = deletable;
+ }
+
+ public List getApplications() {
+ return Collections.unmodifiableList(applications);
+ }
+
+ protected void setApplications(final List applications) {
+ this.applications = new ArrayList<>(applications);
+ }
+
+ protected void addApplication(final String application) {
+ applications.add(application);
+ }
+
+ @Override
+ public int compareTo(final SitesTableRowData other) {
+ return domainOfSite.compareTo(other.getDomainOfSite());
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SystemInformationTab.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SystemInformationTab.java
index cf272a94e..41b1e5600 100644
--- a/ccm-core/src/main/java/org/libreccm/admin/ui/SystemInformationTab.java
+++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SystemInformationTab.java
@@ -54,6 +54,8 @@ class SystemInformationTab extends CustomComponent {
protected SystemInformationTab(final AdminViewController controller) {
+ super();
+
final LocalizedTextsUtil adminTextsUtil = controller
.getGlobalizationHelper()
.getLocalizedTextsUtil(AdminUiConstants.ADMIN_BUNDLE);
diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/UsersGroupsRolesTab.java b/ccm-core/src/main/java/org/libreccm/admin/ui/UsersGroupsRolesTab.java
index e9552dc9c..5901f1685 100644
--- a/ccm-core/src/main/java/org/libreccm/admin/ui/UsersGroupsRolesTab.java
+++ b/ccm-core/src/main/java/org/libreccm/admin/ui/UsersGroupsRolesTab.java
@@ -18,12 +18,8 @@
*/
package org.libreccm.admin.ui;
-import com.arsdigita.ui.admin.AdminUiConstants;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.TabSheet;
-import com.vaadin.ui.UI;
-
-import java.util.ResourceBundle;
/**
*
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 56f0f4067..af0021793 100644
--- a/ccm-core/src/main/java/org/libreccm/sites/Site.java
+++ b/ccm-core/src/main/java/org/libreccm/sites/Site.java
@@ -43,7 +43,9 @@ import javax.persistence.Table;
@NamedQueries({
@NamedQuery(
name = "Site.findByDomain",
- query = "SELECT s FROM Site s WHERE s.domainOfSite = :domain"
+ query = "SELECT s FROM Site s "
+ + "WHERE s.domainOfSite = :domain "
+ + "ORDER BY s.domainOfSite"
)
,
@NamedQuery(
@@ -72,12 +74,12 @@ public class Site extends CcmObject {
@OneToMany(mappedBy = "site")
private List applications;
-
+
public Site() {
super();
applications = new ArrayList<>();
}
-
+
public String getDomainOfSite() {
return domainOfSite;
}
@@ -101,11 +103,11 @@ public class Site extends CcmObject {
public void setDefaultTheme(final String defaultTheme) {
this.defaultTheme = defaultTheme;
}
-
+
public List getApplications() {
return Collections.unmodifiableList(applications);
}
-
+
protected void setApplications(final List applications) {
this.applications = new ArrayList<>(applications);
}
@@ -113,11 +115,11 @@ public class Site extends CcmObject {
protected void addApplication(final SiteAwareApplication application) {
applications.add(application);
}
-
+
protected void removeApplication(final SiteAwareApplication application) {
applications.remove(application);
}
-
+
@Override
public int hashCode() {
int hash = 3;
@@ -147,7 +149,7 @@ public class Site extends CcmObject {
if (!other.canEqual(this)) {
return false;
}
-
+
if (defaultSite != other.isDefaultSite()) {
return false;
}
diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties
index 8b8f6a47b..1da378f6a 100644
--- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties
+++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties
@@ -631,3 +631,5 @@ ui.admin.sites.domain_of_site=Domain of Site
ui.admin.sites.is_default_site=Is default site?
ui.admin.sites.domain_of_site.error.not_unique=The domain of the Site is not unique.
ui.admin.sites.domain_of_site.error.empty=The domain of a Site can't be empty.
+ui.admin.sites.table.buttons.edit=Edit
+ui.admin.sites.table.buttons.delete=Delete
diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties
index 3d6446ec7..d6545b966 100644
--- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties
+++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties
@@ -635,3 +635,5 @@ ui.admin.sites.domain_of_site=Domain der Site
ui.admin.sites.is_default_site=Ist Standard Site?
ui.admin.sites.domain_of_site.error.not_unique=Die Domain der Site ist nicht eindeutig.
ui.admin.sites.domain_of_site.error.empty=The Domain einer Site darf nicht leer sein.
+ui.admin.sites.table.buttons.edit=Bearbeiten
+ui.admin.sites.table.buttons.delete=L\u00f6schen
diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties
index eb37797aa..34feb7c8b 100755
--- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties
+++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties
@@ -628,3 +628,5 @@ ui.admin.sites.domain_of_site=Domain of Site
ui.admin.sites.is_default_site=Is default site?
ui.admin.sites.domain_of_site.error.not_unique=The domain of the Site is not unique.
ui.admin.sites.domain_of_site.error.empty=The domain of a Site can't be empty.
+ui.admin.sites.table.buttons.edit=Edit
+ui.admin.sites.table.buttons.delete=Delete
diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties
index e5814fbc0..33e85d866 100755
--- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties
+++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties
@@ -619,3 +619,5 @@ ui.admin.sites.domain_of_site=Domain of Site
ui.admin.sites.is_default_site=Is default site?
ui.admin.sites.domain_of_site.error.not_unique=The domain of the Site is not unique.
ui.admin.sites.domain_of_site.error.empty=The domain of a Site can't be empty.
+ui.admin.sites.table.buttons.edit=Edit
+ui.admin.sites.table.buttons.delete=Delete