CCM NG: Several fixes and improvments

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5152 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2017-12-01 10:50:47 +00:00
parent bbf0eb9bdd
commit 6ea8ce3861
13 changed files with 177 additions and 19 deletions

View File

@ -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<String, Object> 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,

View File

@ -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;
}

View File

@ -18,14 +18,25 @@
*/
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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class PageModelDetails extends Window {
class PageModelDetails extends Window {
private static final long serialVersionUID = -3617001410191320596L;
@ -34,6 +45,45 @@ import org.libreccm.pagemodel.PageModel;
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));
}
}

View File

@ -252,15 +252,50 @@ public class StaticThemeProvider implements ThemeProvider {
}
@Override
public Optional<InputStream> getThemeFileAsStream(String theme,
ThemeVersion version,
String path) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
public Optional<InputStream> 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

View File

@ -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<ThemeProcessor> processors;
/**

View File

@ -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<ThemeProvider> providers;
//
// @Inject

View File

@ -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<String, Object> 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);
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,23 +1,24 @@
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ccm="http://xmlns.libreccm.org">
<xsl:template match="ccm:categoryPage">
<xsl:template match="page">
<html>
<head>
<title>Category page</title>
</head>
<body>
<xsl:apply-template select="ccm:greetingItem" />
<xsl:apply-templates select="indexItem" />
</body>
</html>
</xsl:template>
<xsl:template match="ccm:greetingItem">
<xsl:template match="indexItem">
<h1>
<xsl:value-of select="./ccm:title" />
<xsl:value-of select="./title" />
</h1>
</xsl:template>

View File

@ -1,4 +1,6 @@
{
"name": "ccm",
"type": "xsl"
"type": "xsl",
"default-template": "category-page.xsl"
}