From d31f3781c0dde9d238c1953179a956245da7aad6 Mon Sep 17 00:00:00 2001 From: jensp Date: Wed, 29 Nov 2017 11:59:20 +0000 Subject: [PATCH] CCM NG: Several bugfixes git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5147 8810af33-2d31-482b-a856-94f89814c4df --- ccm-cms/pom.xml | 11 +- .../ui/pagemodel/ItemListComponentForm.java | 4 +- .../java/org/librecms/pages/PagesRouter.java | 319 +++++++++++++++++- .../admin/ui/ApplicationTreeDataProvider.java | 5 +- .../org/libreccm/admin/ui/PageModelsTab.java | 34 +- .../categorization/CategoryRepository.java | 3 + .../libreccm/theming/StaticThemeProvider.java | 8 +- .../theming/xslt/XsltThemeProcessor.java | 4 +- .../VAADIN/themes/ccm-core/styles.css | 4 +- pom.xml | 28 +- 10 files changed, 372 insertions(+), 48 deletions(-) diff --git a/ccm-cms/pom.xml b/ccm-cms/pom.xml index 47dbe4405..e869238ca 100644 --- a/ccm-cms/pom.xml +++ b/ccm-cms/pom.xml @@ -71,6 +71,15 @@ provided + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-xml-provider + + org.apache.logging.log4j @@ -350,7 +359,7 @@ findbugs-maven-plugin 3.0.5 - + com.github.spotbugs spotbugs-maven-plugin 3.1.0-RC8 diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/ItemListComponentForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/ItemListComponentForm.java index 12cd221bc..b02f12f2b 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/ItemListComponentForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/pagemodel/ItemListComponentForm.java @@ -142,7 +142,9 @@ public class ItemListComponentForm final ItemListComponent component = getComponentModel(); - if (component != null) { + if (component == null) { + pageSizeField.setValue(state, "30"); + }else { final Object[] descendingValue; if (component.isDescending()) { descendingValue = new Object[]{DESCENDING}; 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 af34e5895..0742dbdb9 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java +++ b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java @@ -20,6 +20,10 @@ package org.librecms.pages; import com.arsdigita.kernel.KernelConfig; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; import org.libreccm.categorization.Category; import org.libreccm.categorization.CategoryRepository; import org.libreccm.configuration.ConfigurationManager; @@ -43,6 +47,7 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.transaction.Transactional; import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; import javax.ws.rs.NotFoundException; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @@ -61,7 +66,8 @@ import static org.librecms.pages.PagesConstants.*; * @author Jens Pelzetter */ @RequestScoped -@Path("/{page:.+}") +//@Path("/{page:.+}") +@Path("/") public class PagesRouter { @Inject @@ -99,6 +105,272 @@ public class PagesRouter { .findConfiguration(KernelConfig.class); defaultLocale = kernelConfig.getDefaultLocale(); } + + @GET + @Path("/") + @Transactional(Transactional.TxType.REQUIRED) + public Response getIndexPage(@Context UriInfo uriInfo) { + + final String domain = uriInfo.getBaseUri().getHost(); + final Pages pages = getPages(domain); + final Category category = getCategory(domain, pages, "/"); + + final Locale negoidatedLocale = globalizationHelper + .getNegotiatedLocale(); + + final String language; + if (category.getTitle().hasValue(negoidatedLocale)) { + language = negoidatedLocale.toString(); + } else if (category.getTitle().hasValue(defaultLocale)) { + language = defaultLocale.toString(); + } else { + throw new NotFoundException(); + } + + final String indexPage = String.format("/index.%s.html", language); + final URI uri = uriInfo.getBaseUriBuilder().path(indexPage).build(); + return Response.temporaryRedirect(uri).build(); + } + + @GET + @Path("/index.html") + @Transactional(Transactional.TxType.REQUIRED) + public Response getIndexPageAsHtml(@Context final UriInfo uriInfo) { + + final String domain = uriInfo.getBaseUri().getHost(); + final Pages pages = getPages(domain); + final Category category = getCategory(domain, pages, "/"); + + final Locale negoiatedLocale = globalizationHelper + .getNegotiatedLocale(); + final String language; + if (category.getTitle().hasValue(negoiatedLocale)) { + language = negoiatedLocale.toString(); + } else if (category.getTitle().hasValue(defaultLocale)) { + language = defaultLocale.toString(); + } else { + throw new NotFoundException(); + } + + final String indexPage = String.format("/index.%s.html", language); + final String path = uriInfo.getPath().replace("index.html", indexPage); + + final URI uri = uriInfo.getBaseUriBuilder().replacePath(path).build(); + return Response.temporaryRedirect(uri).build(); + } + + @GET + @Path("/index.{lang}.html") + @Produces("text/html") + @Transactional(Transactional.TxType.REQUIRED) + public String getIndexPageAsHtml( + @Context + final UriInfo uriInfo, + @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) { + + final Map buildResult = getCategoryIndexPage( + uriInfo, "/", language, pageModelVersion); + final Site site = getSite(uriInfo); + final ThemeInfo themeInfo = getTheme(site, theme, themeVersion); + + return themes.process(buildResult, themeInfo); + } + + @GET + @Path("/index.{lang}.json") + @Produces("text/json") + @Transactional(Transactional.TxType.REQUIRED) + public String getIndexPageAsJson( + @Context + final UriInfo uriInfo, + @PathParam("lang") + final String language, + @QueryParam("pagemodel-version") + @DefaultValue("LIVE") + final String pageModelVersion) { + + final ObjectMapper mapper = new ObjectMapper(); + + try { + return mapper + .writeValueAsString(getCategoryIndexPage(uriInfo, + "/", + language, + pageModelVersion)); + } catch (JsonProcessingException ex) { + throw new WebApplicationException(ex); + } +// return getCategoryIndexPage(uriInfo, "/", language, pageModelVersion); + } + + @GET + @Path("/index.{lang}.xml") + @Produces("text/xml") + @Transactional(Transactional.TxType.REQUIRED) + public String getIndexPageAsXml( + @Context + final UriInfo uriInfo, + @PathParam("lang") + final String language, + @QueryParam("pagemodel-version") + @DefaultValue("LIVE") + final String pageModelVersion) { + + final JacksonXmlModule xmlModule = new JacksonXmlModule(); + final ObjectMapper mapper = new XmlMapper(xmlModule); + + try { + return mapper + .writeValueAsString(getCategoryIndexPage(uriInfo, "/", + language, + pageModelVersion)); + } catch (JsonProcessingException ex) { + throw new WebApplicationException(ex); + } +// return getCategoryIndexPage(uriInfo, "/", language, pageModelVersion); + } + + @GET + @Path("/{name}") + @Transactional(Transactional.TxType.REQUIRED) + public Response getRootItemPage( + @Context final UriInfo uriInfo, + @PathParam("name") final String itemName) { + + final String domain = uriInfo.getBaseUri().getHost(); + final Pages pages = getPages(domain); + final Category category = getCategory(domain, pages, "/"); + + final Locale negoiatedLocale = globalizationHelper + .getNegotiatedLocale(); + + final String language; + if (category.getTitle().hasValue(negoiatedLocale)) { + language = negoiatedLocale.toString(); + } else if (category.getTitle().hasValue(defaultLocale)) { + language = defaultLocale.toString(); + } else { + throw new NotFoundException(); + } + + final String itemPage = String.format("/%s.%s.html", itemName, language); + final URI uri = uriInfo.getBaseUriBuilder().path(itemPage).build(); + return Response.temporaryRedirect(uri).build(); + } + + @GET + @Path("/{name}.html") + @Transactional(Transactional.TxType.REQUIRED) + public Response getRootItemPageAsHtml( + @Context final UriInfo uriInfo, + @PathParam("name") final String itemName) { + + final String domain = uriInfo.getBaseUri().getHost(); + final Pages pages = getPages(domain); + final Category category = getCategory(domain, pages, "/"); + + final Locale negoiatedLocale = globalizationHelper + .getNegotiatedLocale(); + + final String language; + if (category.getTitle().hasValue(negoiatedLocale)) { + language = negoiatedLocale.toString(); + } else if (category.getTitle().hasValue(defaultLocale)) { + language = defaultLocale.toString(); + } else { + throw new NotFoundException(); + } + + final String itemPage = String.format("/%s.%s.html", itemName, language); + final String path = uriInfo + .getPath() + .replace(String.format("%s.html", itemName), itemPage); + + final URI uri = uriInfo.getBaseUriBuilder().replacePath(path).build(); + return Response.temporaryRedirect(uri).build(); + } + + @GET + @Path("/{name}.{lang}.html") + @Produces("text/html") + @Transactional(Transactional.TxType.REQUIRED) + public String getRootItemPageAsHtml( + @Context + final UriInfo uriInfo, + @PathParam("name") + final String itemName, + @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) { + + final Map buildResult = getCategoryItemPage( + uriInfo, "/", itemName, language, pageModelVersion); + final Site site = getSite(uriInfo); + final ThemeInfo themeInfo = getTheme(site, "/", themeVersion); + + return themes.process(buildResult, themeInfo); + } + + @GET + @Path("/{name}.{lang}.json") + @Produces("text/json") + @Transactional(Transactional.TxType.REQUIRED) + public Map getRootItemPageAsJson( + @Context + final UriInfo uriInfo, + @PathParam("name") + final String itemName, + @PathParam("lang") + final String language, + @QueryParam("pagemodel-version") + @DefaultValue("LIVE") + final String pageModelVersion) { + + return getCategoryItemPage(uriInfo, + "/", + itemName, + language, + pageModelVersion); + } + + @GET + @Path("/{name}.{lang}.xml") + @Produces("text/xml") + @Transactional(Transactional.TxType.REQUIRED) + public Map getItemPageAsXml( + @Context + final UriInfo uriInfo, + @PathParam("name") + final String itemName, + @PathParam("lang") + final String language, + @QueryParam("pagemodel-version") + @DefaultValue("LIVE") + final String pageModelVersion) { + + return getCategoryItemPage(uriInfo, + "/", + itemName, + language, + pageModelVersion); + } /** * Retrieve the index page of a category. Redirects to @@ -109,7 +381,9 @@ public class PagesRouter { * * @return */ - @Path("/") + @GET + @Path("/{page:.+}/") + @Transactional(Transactional.TxType.REQUIRED) public Response getCategoryIndexPage( @Context final UriInfo uriInfo, @@ -146,7 +420,9 @@ public class PagesRouter { * * @return */ - @Path("/index.html") + @GET + @Path("/{page:.+}/index.html") + @Transactional(Transactional.TxType.REQUIRED) public Response getCategoryIndexPageAsHtml( @Context final UriInfo uriInfo, @@ -187,7 +463,8 @@ public class PagesRouter { * * @return The HTML representation of the index page. */ - @Path("/index.{lang}.html") + @GET + @Path("/{page:.+}/index.{lang}.html") @Produces("text/html") @Transactional(Transactional.TxType.REQUIRED) public String getCategoryIndexPageAsHtml( @@ -225,7 +502,8 @@ public class PagesRouter { * * @return */ - @Path("/index.{lang}.json") + @GET + @Path("/{page:.+}/index.{lang}.json") @Produces("text/json") @Transactional(Transactional.TxType.REQUIRED) public Map getCategoryIndexPageAsJson( @@ -252,7 +530,8 @@ public class PagesRouter { * * @return */ - @Path("/index.{lang}.xml") + @GET + @Path("/{page:.+}/index.{lang}.xml") @Produces("text/xml") @Transactional(Transactional.TxType.REQUIRED) public Map getCategoryIndexPageAsXml( @@ -282,7 +561,9 @@ public class PagesRouter { * * @return */ - @Path("/{name}") + @GET + @Path("/{page:.+}/{name}") + @Transactional(Transactional.TxType.REQUIRED) public Response getItemPage( @Context final UriInfo uriInfo, @PathParam("page") final String page, @@ -320,7 +601,9 @@ public class PagesRouter { * * @return */ - @Path("/{name}.html") + @GET + @Path("/{page:.+}/{name}.html") + @Transactional(Transactional.TxType.REQUIRED) public Response getItemPageAsHtml( @Context final UriInfo uriInfo, @PathParam("page") final String page, @@ -365,7 +648,9 @@ public class PagesRouter { * * @return */ - @Path("/{name}.{lang}.html") + @GET + @Path("/{page:.+}/{name}.{lang}.html") + @Transactional(Transactional.TxType.REQUIRED) public String getItemPageAsHtml( @Context final UriInfo uriInfo, @@ -405,8 +690,10 @@ public class PagesRouter { * * @return */ - @Path("/{name}.{lang}.json") + @GET + @Path("/{page:.+}/{name}.{lang}.json") @Produces("text/json") + @Transactional(Transactional.TxType.REQUIRED) public Map getItemPageAsJson( @Context final UriInfo uriInfo, @@ -439,8 +726,10 @@ public class PagesRouter { * * @return */ - @Path("/{name}.{lang}.xml") + @GET + @Path("/{page:.+}/{name}.{lang}.xml") @Produces("text/xml") + @Transactional(Transactional.TxType.REQUIRED) public Map getItemPageAsXml( @Context final UriInfo uriInfo, @@ -513,8 +802,8 @@ public class PagesRouter { .orElseThrow(() -> new WebApplicationException( String.format("The configured default theme \"%s\" for " + "site \"%s\" is not available.", - site.getDomainOfSite(), - site.getDefaultTheme()), + site.getDefaultTheme(), + site.getDomainOfSite()), Response.Status.INTERNAL_SERVER_ERROR)); } else { return themes.getTheme(theme, @@ -578,8 +867,8 @@ public class PagesRouter { final PageModel pageModel; if ("DRAFT".equals(pageModelVersion)) { - pageModel = pageModelManager.getDraftVersion(page - .getIndexPageModel()); + pageModel = pageModelManager + .getDraftVersion(page.getIndexPageModel()); } else { pageModel = pageModelManager .getLiveVersion(page.getIndexPageModel()) diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/ApplicationTreeDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/ApplicationTreeDataProvider.java index f4b113275..5abd5678b 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/ApplicationTreeDataProvider.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/ApplicationTreeDataProvider.java @@ -30,10 +30,6 @@ import org.libreccm.web.ApplicationType; import org.libreccm.web.CcmApplication; import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.ResourceBundle; -import java.util.stream.Collectors; import java.util.stream.Stream; import javax.inject.Inject; @@ -64,6 +60,7 @@ class ApplicationTreeDataProvider rootNode = new ApplicationTreeNode(); rootNode.setNodeId(ApplicationTreeNode.ROOT); rootNode.setNodeType(ApplicationTreeNodeType.ROOT_NODE); + rootNode.setTitle("/"); } @Transactional(Transactional.TxType.REQUIRED) diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsTab.java b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsTab.java index 55f935bc7..0b5f4feb1 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsTab.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelsTab.java @@ -56,9 +56,7 @@ class PageModelsTab extends CustomComponent { final Tree applicationTree = new Tree<>( adminViewController.getApplicationTreeDataProvider()); - applicationTree.setItemCaptionGenerator(ApplicationTreeNode::getTitle); - applicationTree.setItemCollapseAllowedProvider(node -> { return !node.getNodeType().equals(ApplicationTreeNodeType.ROOT_NODE); }); @@ -99,27 +97,41 @@ class PageModelsTab extends CustomComponent { .addComponentColumn(row -> buildDeleteButton(row, adminViewController)) .setId(COL_DELETE); - pageModelsGrid.setVisible(false); + pageModelsGrid.setWidth("100%"); final Label placeholder = new Label(localizedTextsUtil.getText( "ui.admin.pagemodels.select_application")); final VerticalLayout layout = new VerticalLayout(pageModelsGrid, placeholder); + layout.setWidth("100%"); applicationTree.addItemClickListener(event -> { - final PageModelsTableDataProvider dataProvider - = (PageModelsTableDataProvider) pageModelsGrid - .getDataProvider(); - dataProvider.setApplicationUuid(event.getItem().getNodeId()); - pageModelsGrid.setVisible(true); - placeholder.setVisible(false); + + final ApplicationTreeNode node = event.getItem(); + final ApplicationTreeNodeType nodeType = node.getNodeType(); + + if (nodeType == ApplicationTreeNodeType.APPLICATION_NODE + || nodeType + == ApplicationTreeNodeType.SINGLETON_APPLICATION_NODE) { + final PageModelsTableDataProvider dataProvider + = (PageModelsTableDataProvider) pageModelsGrid + .getDataProvider(); + dataProvider.setApplicationUuid(node.getNodeId()); + pageModelsGrid.setVisible(true); + placeholder.setVisible(false); + } else { + pageModelsGrid.setVisible(false); + placeholder.setVisible(true); + } }); + final VerticalLayout treeLayout = new VerticalLayout(applicationTree); + final HorizontalSplitPanel panel = new HorizontalSplitPanel( - applicationTree, layout); - panel.setSplitPosition(33.0f); + treeLayout, layout); + panel.setSplitPosition(20.0f); super.setCompositionRoot(panel); } diff --git a/ccm-core/src/main/java/org/libreccm/categorization/CategoryRepository.java b/ccm-core/src/main/java/org/libreccm/categorization/CategoryRepository.java index 9251a0320..bbae30082 100644 --- a/ccm-core/src/main/java/org/libreccm/categorization/CategoryRepository.java +++ b/ccm-core/src/main/java/org/libreccm/categorization/CategoryRepository.java @@ -160,6 +160,9 @@ public class CategoryRepository extends AbstractEntityRepository + "domain \"{}\".", normalizedPath, domain.getDomainKey()); + if (normalizedPath.isEmpty()) { + return Optional.of(domain.getRoot()); + } final String[] tokens = normalizedPath.split("/"); Category current = domain.getRoot(); for (final String token : tokens) { diff --git a/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java b/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java index 53842507a..ce99ac234 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java +++ b/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java @@ -194,11 +194,11 @@ public class StaticThemeProvider implements ThemeProvider { Objects.requireNonNull(theme); final String manifestJsonPath = String.format("/" + THEMES_PACKAGE - + "%s/" + + "/%s/" + THEME_MANIFEST_JSON, theme); final String manifestXmlPath = String.format("/" + THEMES_PACKAGE - + "%s/" + + "/%s/" + THEME_MANIFEST_XML, theme); @@ -227,11 +227,11 @@ public class StaticThemeProvider implements ThemeProvider { Objects.requireNonNull(theme); final String manifestJsonPath = String.format("/" + THEMES_PACKAGE - + "%s/" + + "/%s/" + THEME_MANIFEST_JSON, theme); final String manifestXmlPath = String.format("/" + THEMES_PACKAGE - + "%s/" + + "/%s/" + THEME_MANIFEST_XML, theme); diff --git a/ccm-core/src/main/java/org/libreccm/theming/xslt/XsltThemeProcessor.java b/ccm-core/src/main/java/org/libreccm/theming/xslt/XsltThemeProcessor.java index b6d6a81c7..865c4f05e 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/xslt/XsltThemeProcessor.java +++ b/ccm-core/src/main/java/org/libreccm/theming/xslt/XsltThemeProcessor.java @@ -39,7 +39,7 @@ import javax.xml.parsers.ParserConfigurationException; import static org.libreccm.theming.ThemeConstants.*; -import org.libreccm.theming.ThemeVersion; +import org.libreccm.theming.ProcessesThemes; import org.libreccm.theming.manifest.ThemeTemplate; import java.io.InputStream; @@ -50,7 +50,6 @@ import java.io.UnsupportedEncodingException; import java.util.Optional; import javax.xml.transform.Result; -import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; @@ -64,6 +63,7 @@ import javax.xml.transform.stream.StreamSource; * * @author Jens Pelzetter */ +@ProcessesThemes("xsl") @RequestScoped public class XsltThemeProcessor implements ThemeProcessor { diff --git a/ccm-core/src/main/resources/VAADIN/themes/ccm-core/styles.css b/ccm-core/src/main/resources/VAADIN/themes/ccm-core/styles.css index fdc3a0de9..634479040 100644 --- a/ccm-core/src/main/resources/VAADIN/themes/ccm-core/styles.css +++ b/ccm-core/src/main/resources/VAADIN/themes/ccm-core/styles.css @@ -1081,7 +1081,7 @@ */ .v-vaadin-version:after { - content: "8.1.6"; + content: "8.1.7"; } .v-widget { @@ -1172,7 +1172,7 @@ overflow: auto; } -.v-assistive-device-only { +.v-assistive-device-only, .v-assistive-device-only-label label { position: absolute; top: -2000px; left: -2000px; diff --git a/pom.xml b/pom.xml index 5b3af1e08..e0516199f 100644 --- a/pom.xml +++ b/pom.xml @@ -272,7 +272,7 @@ com.vaadin vaadin-maven-plugin - 8.1.6 + 8.1.7 @@ -422,7 +422,7 @@ com.vaadin vaadin-bom - 8.1.6 + 8.1.7 import pom @@ -606,10 +606,17 @@ 1.2 + + com.fasterxml.jackson + jackson-bom + 2.9.0 + import + pom + - + + --> + + + --> + + org.codehaus.woodstox woodstox-core-asl 4.4.1 - + +