203 lines
6.8 KiB
Java
203 lines
6.8 KiB
Java
/*
|
|
* 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.theming.manifest;
|
|
|
|
import com.arsdigita.util.UncheckedWrapperException;
|
|
|
|
import static org.libreccm.theming.ThemeConstants.*;
|
|
|
|
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 com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.InputStreamReader;
|
|
import java.io.Reader;
|
|
import java.io.Serializable;
|
|
import java.io.StringWriter;
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.nio.charset.Charset;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Path;
|
|
import java.util.Locale;
|
|
|
|
|
|
/**
|
|
* A Utility class for loading them manifest file of a theme.
|
|
*
|
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
|
*/
|
|
public class ThemeManifestUtil implements Serializable {
|
|
|
|
private static final long serialVersionUID = -7650437144515619682L;
|
|
|
|
private static final ThemeManifestUtil INSTANCE = new ThemeManifestUtil();
|
|
|
|
private ThemeManifestUtil() {};
|
|
|
|
public static final ThemeManifestUtil getInstance() {
|
|
|
|
return INSTANCE;
|
|
}
|
|
|
|
/**
|
|
* Reads the manifest file at {@code path}.
|
|
*
|
|
* @param path The path of the manifest file.
|
|
*
|
|
* @return The parsed manifest file.
|
|
*/
|
|
public ThemeManifest loadManifest(final Path path) {
|
|
|
|
// final String pathStr = path.toString().toLowerCase(Locale.ROOT);
|
|
final BufferedReader reader;
|
|
try {
|
|
reader = Files.newBufferedReader(path, Charset.forName("UTF-8"));
|
|
} catch (IOException ex) {
|
|
throw new UncheckedWrapperException(ex);
|
|
}
|
|
|
|
return parseManifest(reader, path.toString());
|
|
|
|
// final ObjectMapper mapper;
|
|
// if (pathStr.endsWith(THEME_MANIFEST_JSON)) {
|
|
// mapper = new ObjectMapper();
|
|
// } else if (pathStr.endsWith(THEME_MANIFEST_XML)) {
|
|
// final JacksonXmlModule xmlModule = new JacksonXmlModule();
|
|
// mapper = new XmlMapper(xmlModule);
|
|
// } else {
|
|
// throw new IllegalArgumentException(String
|
|
// .format("The provided path \"%s\" does not point to a theme "
|
|
// + "manifest file.",
|
|
// path.toString()));
|
|
// }
|
|
//
|
|
// mapper.registerModule(new JaxbAnnotationModule());
|
|
//
|
|
// final ThemeManifest manifest;
|
|
// try {
|
|
// manifest = mapper.readValue(reader, ThemeManifest.class);
|
|
// } catch (IOException ex) {
|
|
// throw new UnexpectedErrorException(ex);
|
|
// }
|
|
// return manifest;
|
|
}
|
|
|
|
public ThemeManifest loadManifest(final InputStream inputStream,
|
|
final String fileName) {
|
|
|
|
final InputStreamReader reader;
|
|
try {
|
|
reader = new InputStreamReader(inputStream, "UTF-8");
|
|
} catch (UnsupportedEncodingException ex) {
|
|
throw new UncheckedWrapperException(ex);
|
|
}
|
|
|
|
return parseManifest(reader, fileName);
|
|
|
|
// final ObjectMapper mapper;
|
|
// if (fileName.endsWith(THEME_MANIFEST_JSON)) {
|
|
// mapper = new ObjectMapper();
|
|
// } else if (fileName.endsWith(THEME_MANIFEST_XML)) {
|
|
// final JacksonXmlModule xmlModule = new JacksonXmlModule();
|
|
// mapper = new XmlMapper(xmlModule);
|
|
// } else {
|
|
// throw new IllegalArgumentException(String
|
|
// .format("The provided path \"%s\" does not point to a theme "
|
|
// + "manifest file.",
|
|
// fileName));
|
|
// }
|
|
//
|
|
// mapper.registerModule(new JaxbAnnotationModule());
|
|
//
|
|
// final ThemeManifest manifest;
|
|
// try {
|
|
// manifest = mapper.readValue(reader, ThemeManifest.class);
|
|
// } catch (IOException ex) {
|
|
// throw new UnexpectedErrorException(ex);
|
|
// }
|
|
// return manifest;
|
|
}
|
|
|
|
public String serializeManifest(final ThemeManifest manifest,
|
|
final String format) {
|
|
|
|
final ObjectMapper mapper;
|
|
|
|
switch (format) {
|
|
case THEME_MANIFEST_JSON:
|
|
mapper = new ObjectMapper();
|
|
break;
|
|
case THEME_MANIFEST_XML:
|
|
final JacksonXmlModule xmlModule = new JacksonXmlModule();
|
|
mapper = new XmlMapper(xmlModule);
|
|
break;
|
|
default:
|
|
throw new IllegalArgumentException(
|
|
"Unsupported format for ThemeManifest");
|
|
}
|
|
|
|
mapper.registerModule(new JaxbAnnotationModule());
|
|
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
|
|
|
|
final StringWriter writer = new StringWriter();
|
|
try {
|
|
mapper.writeValue(writer, manifest);
|
|
} catch (IOException ex) {
|
|
throw new UncheckedWrapperException(ex);
|
|
}
|
|
|
|
return writer.toString();
|
|
}
|
|
|
|
private ThemeManifest parseManifest(final Reader reader,
|
|
final String path) {
|
|
|
|
final String pathStr = path.toLowerCase(Locale.ROOT);
|
|
|
|
final ObjectMapper mapper;
|
|
if (pathStr.endsWith(THEME_MANIFEST_JSON)) {
|
|
mapper = new ObjectMapper();
|
|
} else if (pathStr.endsWith(THEME_MANIFEST_XML)) {
|
|
final JacksonXmlModule xmlModule = new JacksonXmlModule();
|
|
mapper = new XmlMapper(xmlModule);
|
|
} else {
|
|
throw new IllegalArgumentException(String
|
|
.format("The provided path \"%s\" does not point to a theme "
|
|
+ "manifest file.",
|
|
path));
|
|
}
|
|
|
|
mapper.registerModule(new JaxbAnnotationModule());
|
|
|
|
final ThemeManifest manifest;
|
|
try {
|
|
manifest = mapper.readValue(reader, ThemeManifest.class);
|
|
} catch (IOException ex) {
|
|
throw new UncheckedWrapperException(ex);
|
|
}
|
|
return manifest;
|
|
}
|
|
|
|
}
|