Package com.liferay.maven.plugins

Source Code of com.liferay.maven.plugins.ThemeMergeMojo

/**
* Copyright (c) 2000-2013 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.maven.plugins;

import com.liferay.maven.plugins.theme.Theme;
import com.liferay.maven.plugins.util.ContextReplace;
import com.liferay.maven.plugins.util.GetterUtil;
import com.liferay.maven.plugins.util.PortalUtil;
import com.liferay.maven.plugins.util.SAXReaderUtil;
import com.liferay.maven.plugins.util.StringUtil;
import com.liferay.maven.plugins.util.Validator;

import java.io.File;

import java.util.Iterator;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Dependency;

import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.components.io.fileselectors.FileSelector;
import org.codehaus.plexus.components.io.fileselectors.IncludeExcludeFileSelector;

import org.dom4j.Document;
import org.dom4j.Element;

/**
* @author Mika Koivisto
* @goal   theme-merge
* @phase  process-sources
*/
public class ThemeMergeMojo extends AbstractLiferayMojo {

  protected void cleanUpTemplates(File templatesDir) {
    File initFile = new File(templatesDir, "init." + themeType);

    FileUtils.deleteQuietly(initFile);

    String[] extensions = null;

    if (themeType.equals("ftl")) {
      extensions = new String[] {"vm", "jsp"};
    }
    else if (themeType.equals("jsp")) {
      extensions = new String[] {"vm", "ftl"};
    }
    else {
      extensions = new String[] {"ftl", "jsp"};
    }

    Iterator<File> iterator = FileUtils.iterateFiles(
      templatesDir, extensions, false);

    while (iterator.hasNext()) {
      File file = iterator.next();

      FileUtils.deleteQuietly(file);
    }
  }

  protected void doExecute() throws Exception {
    workDir = new File(workDir, "liferay-theme");

    if (!workDir.exists()) {
      workDir.mkdirs();
    }

    if (Validator.isNotNull(parentTheme)) {
      if (parentTheme.indexOf(":") > 0) {
        String[] parentThemeArray = parentTheme.split(":");

        parentThemeArtifactGroupId = parentThemeArray[0];
        parentThemeArtifactId = parentThemeArray[1];
        parentThemeArtifactVersion = parentThemeArray[2];
        parentThemeId = null;
      }
      else {
        parentThemeId = parentTheme;
      }
    }

    getLog().info("Parent theme group ID " + parentThemeArtifactGroupId);
    getLog().info("Parent theme artifact ID " + parentThemeArtifactId);
    getLog().info("Parent theme version " + parentThemeArtifactVersion);
    getLog().info("Parent theme ID " + parentThemeId);

    String[] excludes = null;
    String[] includes = null;

    boolean portalTheme = false;

    if (parentThemeArtifactGroupId.equals("com.liferay.portal") &&
      parentThemeArtifactId.equals("portal-web")) {

      portalTheme = true;
    }

    if (!portalTheme) {
      Dependency dependency = createDependency(
        parentThemeArtifactGroupId, parentThemeArtifactId,
        parentThemeArtifactVersion, "", "war");

      Artifact artifact = resolveArtifact(dependency);

      UnArchiver unArchiver = archiverManager.getUnArchiver(
        artifact.getFile());

      unArchiver.setDestDirectory(workDir);
      unArchiver.setSourceFile(artifact.getFile());

      IncludeExcludeFileSelector includeExcludeFileSelector =
        new IncludeExcludeFileSelector();

      includeExcludeFileSelector.setExcludes(excludes);
      includeExcludeFileSelector.setIncludes(includes);

      unArchiver.setFileSelectors(
        new FileSelector[] {includeExcludeFileSelector});

      unArchiver.extract();
    }

    File liferayLookAndFeelXml = new File(
      webappSourceDir, "WEB-INF/liferay-look-and-feel.xml");

    if (liferayLookAndFeelXml.exists()) {
      Document document = SAXReaderUtil.read(
        liferayLookAndFeelXml, false);

      Element rootElement = document.getRootElement();

      List<Element> themeElements = rootElement.elements("theme");

      for (Element themeElement : themeElements) {
        String id = themeElement.attributeValue("id");

        if (Validator.isNotNull(themeId) && !themeId.equals(id)) {
          continue;
        }

        Theme targetTheme = readTheme(themeElement);

        if (portalTheme) {
          mergePortalTheme(targetTheme);
        }
        else {
          File sourceLiferayLookAndFeelXml = new File(
            workDir, "WEB-INF/liferay-look-and-feel.xml");

          Theme sourceTheme = readTheme(
            parentThemeId, sourceLiferayLookAndFeelXml);

          mergeTheme(sourceTheme, targetTheme);
        }
      }
    }
    else {
      String id = PortalUtil.getJsSafePortletId(project.getArtifactId());

      Theme targetTheme = readTheme(id, null);

      if (portalTheme) {
        mergePortalTheme(targetTheme);
      }
      else {
        File sourceLiferayLookAndFeelXml = new File(
          workDir, "WEB-INF/liferay-look-and-feel.xml");

        Theme sourceTheme = readTheme(
          parentThemeId, sourceLiferayLookAndFeelXml);

        mergeTheme(sourceTheme, targetTheme);
      }
    }
  }

  protected void mergePortalTheme(Theme targetTheme) throws Exception {
    File templatesDir = new File(webappDir, targetTheme.getTemplatesPath());

    templatesDir.mkdirs();

    FileUtils.copyDirectory(
      new File(appServerPortalDir, "html/themes/_unstyled/templates"),
      templatesDir);

    getLog().info(
      "Copying html/themes/_unstyled/templates to " + templatesDir);

    File cssDir = new File(webappDir, targetTheme.getCssPath());

    cssDir.mkdirs();

    FileUtils.copyDirectory(
      new File(appServerPortalDir, "html/themes/_unstyled/css"), cssDir);

    getLog().info("Copying html/themes/_unstyled/css to " + cssDir);

    File imagesDir = new File(webappDir, targetTheme.getImagesPath());

    imagesDir.mkdirs();

    FileUtils.copyDirectory(
      new File(appServerPortalDir, "html/themes/_unstyled/images"),
      imagesDir);

    getLog().info("Copying html/themes/_unstyled/images to " + imagesDir);

    File javaScriptDir = new File(
      webappDir, targetTheme.getJavaScriptPath());

    javaScriptDir.mkdirs();

    FileUtils.copyDirectory(
      new File(appServerPortalDir, "html/themes/_unstyled/js"),
      javaScriptDir);

    getLog().info("Copying html/themes/_unstyled/js to " + javaScriptDir);

    if (parentThemeId.equals("_unstyled")) {
      mergeTheme(webappSourceDir, targetTheme, targetTheme);

      return;
    }

    FileUtils.copyDirectory(
      new File(appServerPortalDir, "html/themes/_styled/css"), cssDir);

    getLog().info("Copying html/themes/_styled/css to " + cssDir);

    FileUtils.copyDirectory(
      new File(appServerPortalDir, "html/themes/_styled/images"),
      imagesDir);

    getLog().info("Copying html/themes/_styled/images to " + imagesDir);

    if (parentThemeId.equals("_styled")) {
      mergeTheme(webappSourceDir, targetTheme, targetTheme);

      return;
    }

    File liferayLookAndFeelXml = new File(
      appServerPortalDir, "WEB-INF/liferay-look-and-feel.xml");

    Theme sourceTheme = readTheme(parentThemeId, liferayLookAndFeelXml);

    mergeTheme(appServerPortalDir, sourceTheme, targetTheme);
    mergeTheme(webappSourceDir, targetTheme, targetTheme);
  }

  protected void mergeTheme(
      File sourceDir, Theme sourceTheme, Theme targetTheme)
    throws Exception {

    File sourceCssDir = new File(sourceDir, sourceTheme.getCssPath());

    if (sourceCssDir.exists()) {
      File targetCssDir = new File(webappDir, targetTheme.getCssPath());

      targetCssDir.mkdirs();

      FileUtils.copyDirectory(sourceCssDir, targetCssDir);

      getLog().info("Copying " + sourceCssDir + " to " + targetCssDir);
    }

    File sourceImagesDir = new File(sourceDir, sourceTheme.getImagesPath());

    if (sourceImagesDir.exists()) {
      File targetImagesDir = new File(
        webappDir, targetTheme.getImagesPath());

      targetImagesDir.mkdirs();

      FileUtils.copyDirectory(sourceImagesDir, targetImagesDir);

      getLog().info(
        "Copying " + sourceImagesDir + " to " + targetImagesDir);
    }

    File sourceJavaScriptDir = new File(
      sourceDir, sourceTheme.getJavaScriptPath());

    if (sourceJavaScriptDir.exists()) {
      File targetJavaScriptDir = new File(
        webappDir, targetTheme.getJavaScriptPath());

      targetJavaScriptDir.mkdirs();

      FileUtils.copyDirectory(sourceJavaScriptDir, targetJavaScriptDir);

      getLog().info(
        "Copying " + sourceJavaScriptDir + " to " +
          targetJavaScriptDir);
    }

    File sourceTemplatesDir = new File(
      sourceDir, sourceTheme.getTemplatesPath());

    if (sourceTemplatesDir.exists()) {
      File targetTemplatesDir = new File(
        webappDir, targetTheme.getTemplatesPath());

      targetTemplatesDir.mkdirs();

      FileUtils.copyDirectory(sourceTemplatesDir, targetTemplatesDir);

      getLog().info(
        "Copying " + sourceTemplatesDir + " to " + targetTemplatesDir);

      cleanUpTemplates(targetTemplatesDir);
    }
  }

  protected void mergeTheme(Theme sourceTheme, Theme targetTheme)
    throws Exception {

    mergeTheme(workDir, sourceTheme, targetTheme);
    mergeTheme(webappSourceDir, targetTheme, targetTheme);
  }

  protected Theme readTheme(Element themeElement) {
    String id = themeElement.attributeValue("id");

    Theme theme = new Theme(id);

    ContextReplace themeContextReplace = new ContextReplace();

    themeContextReplace.addValue("themes-path", null);

    String rootPath = GetterUtil.getString(
      themeElement.elementText("root-path"), "/");

    rootPath = themeContextReplace.replace(rootPath);

    themeContextReplace.addValue("root-path", rootPath);

    theme.setRootPath(rootPath);

    String templatesPath = GetterUtil.getString(
      themeElement.elementText("templates-path"),
      rootPath.concat("/templates"));

    templatesPath = themeContextReplace.replace(templatesPath);
    templatesPath = StringUtil.safePath(templatesPath);

    themeContextReplace.addValue("templates-path", templatesPath);

    theme.setTemplatesPath(templatesPath);

    String cssPath = GetterUtil.getString(
      themeElement.elementText("css-path"), rootPath.concat("/css"));

    cssPath = themeContextReplace.replace(cssPath);
    cssPath = StringUtil.safePath(cssPath);

    themeContextReplace.addValue("css-path", cssPath);

    theme.setCssPath(cssPath);

    String imagesPath = GetterUtil.getString(
      themeElement.elementText("images-path"),
      rootPath.concat("/images"));

    imagesPath = themeContextReplace.replace(imagesPath);
    imagesPath = StringUtil.safePath(imagesPath);

    themeContextReplace.addValue("images-path", imagesPath);

    theme.setImagesPath(imagesPath);

    String javaScriptPath = GetterUtil.getString(
      themeElement.elementText("javascript-path"),
      rootPath.concat("/js"));

    javaScriptPath = themeContextReplace.replace(javaScriptPath);
    javaScriptPath = StringUtil.safePath(javaScriptPath);

    themeContextReplace.addValue("javascript-path", javaScriptPath);

    theme.setJavaScriptPath(javaScriptPath);

    String templateExtension = GetterUtil.getString(
      themeElement.elementText("template-extension"), themeType);

    theme.setTemplateExtension(templateExtension);

    return theme;
  }

  protected Theme readTheme(String themeId, File liferayLookAndFeelXml)
    throws Exception {

    if ((liferayLookAndFeelXml != null) && liferayLookAndFeelXml.exists()) {
      Document document = SAXReaderUtil.read(
        liferayLookAndFeelXml, false);

      Element rootElement = document.getRootElement();

      List<Element> themeElements = rootElement.elements("theme");

      for (Element themeElement : themeElements) {
        String id = themeElement.attributeValue("id");

        if (Validator.isNotNull(themeId) && !themeId.equals(id)) {
          continue;
        }

        return readTheme(themeElement);
      }
    }

    Theme theme = new Theme(themeId);

    theme.setCssPath("/css");
    theme.setImagesPath("/images");
    theme.setJavaScriptPath("/js");
    theme.setRootPath("/");
    theme.setTemplateExtension(themeType);
    theme.setTemplatesPath("/templates");

    return theme;
  }

  /**
   * The parent theme can be _styled, _unstyled, classic, control_panel, or artifactGroupId:artifactId:artifactVersion.
   *
   * @parameter
   * @deprecated As of 6.2.0
   */
  private String parentTheme;

  /**
   * @parameter default-value="com.liferay.portal"
   */
  private String parentThemeArtifactGroupId;

  /**
   * @parameter default-value="portal-web"
   */
  private String parentThemeArtifactId;

  /**
   * @parameter default-value="${liferay.version}"
   */
  private String parentThemeArtifactVersion;

  /**
   * @parameter default-value="_styled"
   */
  private String parentThemeId;

  /**
   * @parameter
   */
  private String themeId;

  /**
   * @parameter default-value="vm"
   * @required
   */
  private String themeType;

  /**
   * @parameter default-value="${project.build.directory}/${project.build.finalName}"
   * @required
   */
  private File webappDir;

  /**
   * @parameter default-value="${basedir}/src/main/webapp"
   * @required
   */
  private File webappSourceDir;

}
TOP

Related Classes of com.liferay.maven.plugins.ThemeMergeMojo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.