/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * 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. */ package com.liferay.portal.tools.theme.builder; import com.beust.jcommander.JCommander; import com.beust.jcommander.ParameterException; import com.liferay.portal.tools.theme.builder.internal.util.FileUtil; import com.liferay.portal.tools.theme.builder.internal.util.Validator; import java.io.File; import java.io.IOException; import java.net.URI; import java.nio.charset.StandardCharsets; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; import java.util.HashMap; import java.util.Map; import net.coobird.thumbnailator.Thumbnails; import net.coobird.thumbnailator.Thumbnails.Builder; /** * @author David Truong * @author Andrea Di Giorgi */ public class ThemeBuilder { public static final String STYLED = "_styled"; public static final String UNSTYLED = "_unstyled"; public static void main(String[] args) throws Exception { ThemeBuilderArgs themeBuilderArgs = new ThemeBuilderArgs(); JCommander jCommander = new JCommander(themeBuilderArgs); try { File jarFile = FileUtil.getJarFile(); if (jarFile.isFile()) { jCommander.setProgramName("java -jar " + jarFile.getName()); } else { jCommander.setProgramName(ThemeBuilder.class.getName()); } jCommander.parse(args); if (themeBuilderArgs.isHelp()) { _printHelp(jCommander); } else { ThemeBuilder themeBuilder = new ThemeBuilder(themeBuilderArgs); themeBuilder.build(); } } catch (ParameterException pe) { System.err.println(pe.getMessage()); _printHelp(jCommander); } } public ThemeBuilder( File diffsDir, String name, File outputDir, File parentDir, String parentName, String templateExtension, File unstyledDir) { if (Validator.isNull(name)) { name = ThemeBuilderArgs.DEFAULT_NAME; } if (outputDir == null) { throw new IllegalArgumentException( "The output directory is required"); } if (parentDir == null) { if (Validator.isNotNull(parentName) && ((unstyledDir == null) || ((unstyledDir != null) && !parentName.equals(UNSTYLED)))) { throw new IllegalArgumentException("Parent path is required"); } } else { if (Validator.isNull(parentName)) { throw new IllegalArgumentException("Parent name is required"); } if (!parentName.equals(UNSTYLED) && (unstyledDir == null)) { throw new IllegalArgumentException("Unstyled path is required"); } if (parentName.equals(UNSTYLED) && (unstyledDir != null)) { unstyledDir = parentDir; parentDir = null; } } if (Validator.isNull(templateExtension)) { templateExtension = ThemeBuilderArgs.DEFAULT_TEMPLATE_EXTENSION; } else { templateExtension = templateExtension.toLowerCase(); } _diffsDir = diffsDir; _name = name; _outputDir = outputDir; _parentDir = parentDir; _parentName = parentName; _templateExtension = templateExtension; _unstyledDir = unstyledDir; System.setProperty("java.awt.headless", "true"); } public ThemeBuilder(ThemeBuilderArgs themeBuilderArgs) { this( themeBuilderArgs.getDiffsDir(), themeBuilderArgs.getName(), themeBuilderArgs.getOutputDir(), themeBuilderArgs.getParentDir(), themeBuilderArgs.getParentName(), themeBuilderArgs.getTemplateExtension(), themeBuilderArgs.getUnstyledDir()); } public void build() throws Exception { if (_unstyledDir != null) { _copyTheme(UNSTYLED, _unstyledDir); } if (_parentDir != null) { _copyTheme(_parentName, _parentDir); } _writeLookAndFeelXml(); if (_diffsDir != null) { _copyTheme(_diffsDir.toPath()); } _writeScreenshotThumbnail(); } private static void _printHelp(JCommander jCommander) throws Exception { jCommander.usage(); } private void _copyTheme(final Path themeDirPath) throws IOException { final Path outputDirPath = _outputDir.toPath(); Files.walkFileTree( themeDirPath, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile( Path path, BasicFileAttributes basicFileAttributes) throws IOException { if (_isIgnoredFile(path.toString())) { return FileVisitResult.CONTINUE; } String relativePath = String.valueOf( themeDirPath.relativize(path)); Path outputPath = outputDirPath.resolve(relativePath); Files.createDirectories(outputPath.getParent()); Files.copy( path, outputPath, StandardCopyOption.REPLACE_EXISTING); return FileVisitResult.CONTINUE; } }); } private void _copyTheme(String themeName, File themeDir) throws Exception { Path themePath = themeDir.toPath(); if (Files.isDirectory(themePath)) { _copyTheme(themePath); } else { URI uri = themePath.toUri(); Map<String, String> properties = new HashMap<>(); properties.put("create", "false"); properties.put("encoding", StandardCharsets.UTF_8.name()); try (FileSystem fileSystem = FileSystems.newFileSystem( new URI("jar:" + uri.getScheme(), uri.getPath(), null), properties)) { String extension = FileUtil.getExtension( String.valueOf(themePath.getFileName())); if (extension.equalsIgnoreCase("jar")) { _copyTheme( fileSystem.getPath("/META-INF/resources/" + themeName)); } else { _copyTheme(fileSystem.getPath("/")); } } } } private boolean _isIgnoredFile(String fileName) { String extension = FileUtil.getExtension(fileName); if ((extension.equalsIgnoreCase("ftl") || extension.equalsIgnoreCase("vm")) && !extension.equalsIgnoreCase(_templateExtension)) { return true; } if (fileName.endsWith("aui.css") || fileName.endsWith("main.css") || fileName.endsWith("rtl.css")) { return true; } return false; } private void _writeLookAndFeelXml() throws IOException { Path path = _outputDir.toPath(); path = path.resolve("WEB-INF/liferay-look-and-feel.xml"); if (Files.exists(path)) { return; } String content = FileUtil.read( ThemeBuilder.class, "dependencies/liferay-look-and-feel.xml"); String id = _name.toLowerCase(); id = id.replaceAll(" ", "_"); content = content.replace("[$ID$]", id); content = content.replace("[$NAME$]", _name); content = content.replace("[$TEMPLATE_EXTENSION$]", _templateExtension); Files.createDirectories(path.getParent()); Files.write(path, content.getBytes(StandardCharsets.UTF_8)); } private void _writeScreenshotThumbnail() throws IOException { File file = new File(_outputDir, "images/screenshot.png"); if (!file.exists()) { return; } Builder<File> thumbnailBuilder = Thumbnails.of(file); thumbnailBuilder.outputFormat("png"); thumbnailBuilder.size(160, 120); thumbnailBuilder.toFile(new File(_outputDir, "images/thumbnail.png")); } private final File _diffsDir; private final String _name; private final File _outputDir; private final File _parentDir; private final String _parentName; private final String _templateExtension; private final File _unstyledDir; }