From 590f38b4b6402f0523532c68705b8c8442184160 Mon Sep 17 00:00:00 2001 From: jensp Date: Fri, 1 Dec 2017 10:50:47 +0000 Subject: [PATCH] CCM NG: Several fixes and improvments git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5152 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: ba97c6bf808029c4d160c6f64c66439e26ba09f6 --- .../java/org/librecms/pages/PagesRouter.java | 7 ++- .../admin/ui/AdminViewController.java | 8 +++ .../libreccm/admin/ui/PageModelDetails.java | 58 +++++++++++++++++-- .../libreccm/theming/StaticThemeProvider.java | 47 +++++++++++++-- .../org/libreccm/theming/ThemeProcessors.java | 2 + .../java/org/libreccm/theming/Themes.java | 2 + .../theming/xslt/XsltThemeProcessor.java | 49 +++++++++++++++- .../ui/admin/AdminResources.properties | 2 + .../ui/admin/AdminResources_de.properties | 2 + .../ui/admin/AdminResources_en.properties | 2 + .../ui/admin/AdminResources_fr.properties | 2 + .../resources/themes/ccm/category-page.xsl | 11 ++-- .../src/main/resources/themes/ccm/theme.json | 4 +- 13 files changed, 177 insertions(+), 19 deletions(-) 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 f3cad4f37..f1f3d0ef8 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java +++ b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java @@ -22,6 +22,7 @@ import com.arsdigita.kernel.KernelConfig; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import org.libreccm.categorization.Category; @@ -233,13 +234,17 @@ public class PagesRouter { final JacksonXmlModule xmlModule = new JacksonXmlModule(); final ObjectMapper mapper = new XmlMapper(xmlModule); + mapper.enable(SerializationFeature.INDENT_OUTPUT); try { final Map result = getCategoryIndexPage(uriInfo, "/", language, pageModelVersion); - final String html = mapper.writeValueAsString(result); + final String html = mapper + .writer() + .withRootName("page") + .writeValueAsString(result); return html; // return mapper // .writeValueAsString(getCategoryIndexPage(uriInfo, 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 d47b11c9d..3699b7c72 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 @@ -19,6 +19,7 @@ package org.libreccm.admin.ui; import com.vaadin.cdi.ViewScoped; +import org.libreccm.configuration.ConfigurationManager; import org.libreccm.l10n.GlobalizationHelper; import java.io.Serializable; @@ -39,6 +40,9 @@ class AdminViewController implements Serializable { @Inject private ApplicationTreeDataProvider applicationTreeDataProvider; + @Inject + private ConfigurationManager configurationManager; + @Inject private ConfigurationsTabController confTabController; @@ -65,6 +69,10 @@ class AdminViewController implements Serializable { return applicationTreeDataProvider; } + public ConfigurationManager getConfigurationManager() { + return configurationManager; + } + public ConfigurationsTabController getConfTabController() { return confTabController; } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelDetails.java b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelDetails.java index 155cd7ab0..3826a6e6a 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelDetails.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/PageModelDetails.java @@ -18,22 +18,72 @@ */ package org.libreccm.admin.ui; +import com.arsdigita.kernel.KernelConfig; +import com.arsdigita.ui.admin.AdminUiConstants; + +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; +import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.l10n.GlobalizationHelper; +import org.libreccm.l10n.LocalizedTextsUtil; import org.libreccm.pagemodel.PageModel; +import java.util.Locale; + /** * * @author Jens Pelzetter */ - class PageModelDetails extends Window { +class PageModelDetails extends Window { private static final long serialVersionUID = -3617001410191320596L; - + PageModelDetails(final PageModel pageModel, final AdminViewController controller) { - + super(); + + final GlobalizationHelper globalizationHelper = controller + .getGlobalizationHelper(); + final LocalizedTextsUtil textsUtil = globalizationHelper + .getLocalizedTextsUtil(AdminUiConstants.ADMIN_BUNDLE); + final ConfigurationManager configurationManager = controller + .getConfigurationManager(); + final KernelConfig kernelConfig = configurationManager + .findConfiguration(KernelConfig.class); + final Locale defaultLocale = kernelConfig.getDefaultLocale(); + + super.setCaption(textsUtil + .getText("ui.admin.pagemodels.details.heading", + new String[]{pageModel.getName()})); + + final Label nameLabel = new Label(pageModel.getName()); + nameLabel.setCaption(textsUtil + .getText("ui.admin.pagemodels.details.model_name")); + + final Label titleLabel = new Label(pageModel + .getTitle().getValue(defaultLocale)); + titleLabel.setCaption(textsUtil + .getText("ui.admin.pagemodels.details.model_title")); + + final Label applicationLabel = new Label(pageModel + .getApplication().getPrimaryUrl()); + applicationLabel.setCaption(textsUtil + .getText("ui.admin.pagemodels.details.model_application")); + + final Label descLabel = new Label(pageModel + .getDescription().getValue(defaultLocale)); + descLabel.setCaption(textsUtil + .getText("ui.admin.pagemodels.details.model_desc")); + + final FormLayout propertiesSheetLayout = new FormLayout( + nameLabel, titleLabel, applicationLabel, descLabel); + + + super.setContent(new VerticalLayout(propertiesSheetLayout)); } - + } 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 ce99ac234..468363d3d 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java +++ b/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java @@ -252,15 +252,50 @@ public class StaticThemeProvider implements ThemeProvider { } @Override - public Optional getThemeFileAsStream(String theme, - ThemeVersion version, - String path) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + public Optional getThemeFileAsStream(final String theme, + final ThemeVersion version, + final String path) { + + Objects.requireNonNull(theme); + Objects.requireNonNull(path); + + if (theme.isEmpty() + || theme.matches("\\s*")) { + throw new IllegalArgumentException( + "The name of the theme can't be empty."); + } + if (path.isEmpty() + || path.matches("\\s*")) { + throw new IllegalArgumentException("The path can't be empty."); + } + + final String filePath; + if (path.startsWith("/")) { + filePath = String.format("/" + THEMES_PACKAGE + "/%s/%s", + theme, + path.substring(1)); + } else { + filePath = String.format("/" + THEMES_PACKAGE + "/%s/%s", + theme, + path); + } + + final InputStream stream = getClass().getResourceAsStream(filePath); + if (stream == null) { + return Optional.empty(); + } else { + return Optional.of(stream); + } } @Override - public OutputStream getOutputStreamForThemeFile(String theme, String path) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + public OutputStream getOutputStreamForThemeFile(final String theme, + final String path) { + + throw new UnsupportedOperationException(String + .format("This implementation of %s interface does not support " + + "changes to the theme files.", + ThemeProvider.class.getName())); } @Override diff --git a/ccm-core/src/main/java/org/libreccm/theming/ThemeProcessors.java b/ccm-core/src/main/java/org/libreccm/theming/ThemeProcessors.java index c0d7ade2c..338176e64 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/ThemeProcessors.java +++ b/ccm-core/src/main/java/org/libreccm/theming/ThemeProcessors.java @@ -24,6 +24,7 @@ import java.io.Serializable; import java.util.Optional; import javax.enterprise.context.RequestScoped; +import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.enterprise.util.AnnotationLiteral; import javax.inject.Inject; @@ -42,6 +43,7 @@ public class ThemeProcessors implements Serializable { * All available implementations of {@link ThemeProcessor}. */ @Inject + @Any private Instance processors; /** diff --git a/ccm-core/src/main/java/org/libreccm/theming/Themes.java b/ccm-core/src/main/java/org/libreccm/theming/Themes.java index 08e856f29..d4d0a1b7c 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/Themes.java +++ b/ccm-core/src/main/java/org/libreccm/theming/Themes.java @@ -30,6 +30,7 @@ import java.util.Map; import java.util.Optional; import javax.enterprise.context.RequestScoped; +import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.inject.Inject; @@ -48,6 +49,7 @@ public class Themes implements Serializable { private static final Logger LOGGER = LogManager.getLogger(Themes.class); @Inject + @Any private Instance providers; // // @Inject 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 865c4f05e..32b90b37b 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,16 +39,22 @@ import javax.xml.parsers.ParserConfigurationException; import static org.libreccm.theming.ThemeConstants.*; +import com.fasterxml.jackson.databind.SerializationFeature; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.libreccm.theming.ProcessesThemes; import org.libreccm.theming.manifest.ThemeTemplate; +import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringWriter; import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.util.Optional; +import javax.xml.transform.ErrorListener; import javax.xml.transform.Result; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; @@ -69,6 +75,9 @@ public class XsltThemeProcessor implements ThemeProcessor { private static final long serialVersionUID = -3883625727845105417L; + private static final Logger LOGGER = LogManager + .getLogger(XsltThemeProcessor.class); + @Override public String process(final Map page, final ThemeInfo theme, @@ -77,10 +86,14 @@ public class XsltThemeProcessor implements ThemeProcessor { //Convert page to XML final JacksonXmlModule xmlModule = new JacksonXmlModule(); final ObjectMapper mapper = new XmlMapper(xmlModule); + mapper.enable(SerializationFeature.INDENT_OUTPUT); final String pageAsXml; try { - pageAsXml = mapper.writeValueAsString(page); + pageAsXml = mapper + .writer() + .withRootName("page") + .writeValueAsString(page); } catch (JsonProcessingException ex) { throw new UnexpectedErrorException(ex); } @@ -96,7 +109,9 @@ public class XsltThemeProcessor implements ThemeProcessor { final Document document; try { - document = documentBuilder.parse(pageAsXml); + final InputStream xmlBytesStream = new ByteArrayInputStream( + pageAsXml.getBytes(StandardCharsets.UTF_8)); + document = documentBuilder.parse(xmlBytesStream); } catch (SAXException | IOException ex) { throw new UnexpectedErrorException(ex); } @@ -152,6 +167,36 @@ public class XsltThemeProcessor implements ThemeProcessor { transformer.setURIResolver(new CcmUriResolver(theme.getName(), theme.getVersion(), themeProvider)); + transformer.setErrorListener(new ErrorListener() { + + @Override + public void warning(final TransformerException te) + throws TransformerException { + + LOGGER.warn("A WARNING was reported by the " + + "XSLT Transformer:", + te); + } + + @Override + public void error(final TransformerException te) + throws TransformerException { + + LOGGER.warn("An ERROR was reported by the " + + "XSLT Transformer:", + te); + } + + @Override + public void fatalError(final TransformerException te) + throws TransformerException { + + LOGGER.warn("An FATAL ERROR was reported by the " + + "XSLT Transformer:", + te); + } + + }); } catch (TransformerConfigurationException ex) { throw new UnexpectedErrorException(ex); } 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 09e321481..da8c5bd72 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 @@ -688,3 +688,5 @@ ui.admin.users.table.filter.rolename.placeholder=Name of role ui.admin.users.table.filter.rolename.description=Filter roles by name ui.admin.pagemodels.table.columns.headers.islive=Is live? ui.admin.pagemodels.select_application=Please select an application +ui.admin.pagemodels.table.columns.edit.label=Edit +ui.admin.pagemodels.table.columns.delete.label=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 c5b547046..995e9459a 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 @@ -692,3 +692,5 @@ ui.admin.users.table.filter.rolename.placeholder=Name der Rolle ui.admin.users.table.filter.rolename.description=Rollen nach Name filtern ui.admin.pagemodels.table.columns.headers.islive=Ist publiziert? ui.admin.pagemodels.select_application=Bitte eine Applikation ausw\u00e4hlen +ui.admin.pagemodels.table.columns.edit.label=Bearbeiten +ui.admin.pagemodels.table.columns.delete.label=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 04274acdc..1a6e33e8a 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 @@ -685,3 +685,5 @@ ui.admin.users.table.filter.rolename.placeholder=Name of role ui.admin.users.table.filter.rolename.description=Filter roles by name ui.admin.pagemodels.table.columns.headers.islive=Is live? ui.admin.pagemodels.select_application=Please select an application +ui.admin.pagemodels.table.columns.edit.label=Edit +ui.admin.pagemodels.table.columns.delete.label=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 3388b7023..f0230f4d0 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 @@ -676,3 +676,5 @@ ui.admin.users.table.filter.rolename.placeholder=Name of role ui.admin.users.table.filter.rolename.description=Filter roles by name ui.admin.pagemodels.table.columns.headers.islive=Is live? ui.admin.pagemodels.select_application=Please select an application +ui.admin.pagemodels.table.columns.edit.label=Edit +ui.admin.pagemodels.table.columns.delete.label=Delete diff --git a/ccm-core/src/main/resources/themes/ccm/category-page.xsl b/ccm-core/src/main/resources/themes/ccm/category-page.xsl index 2f4482250..9cea8aa06 100644 --- a/ccm-core/src/main/resources/themes/ccm/category-page.xsl +++ b/ccm-core/src/main/resources/themes/ccm/category-page.xsl @@ -1,23 +1,24 @@ - - + Category page - + - +

- +

diff --git a/ccm-core/src/main/resources/themes/ccm/theme.json b/ccm-core/src/main/resources/themes/ccm/theme.json index 7d21fafab..2da4d3736 100644 --- a/ccm-core/src/main/resources/themes/ccm/theme.json +++ b/ccm-core/src/main/resources/themes/ccm/theme.json @@ -1,4 +1,6 @@ { "name": "ccm", - "type": "xsl" + "type": "xsl", + + "default-template": "category-page.xsl" }