All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.maven.plugins.AbstractLiferayMojo Maven / Gradle / Ivy

There is a newer version: 7.0.0-m2
Show newest version
/**
 * 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.util.CopyTask;
import com.liferay.maven.plugins.util.FileUtil;
import com.liferay.maven.plugins.util.GetterUtil;
import com.liferay.maven.plugins.util.SAXReaderUtil;
import com.liferay.maven.plugins.util.Validator;

import java.io.File;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;

import java.security.Permission;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.model.Dependency;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;

import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.archiver.manager.ArchiverManager;

import org.xml.sax.EntityResolver;

/**
 * @author Mika Koivisto
 */
public abstract class AbstractLiferayMojo extends AbstractMojo {

	public static final float PORTAL_VERSION_6_1 = 6.1f;

	public static final float PORTAL_VERSION_6_2 = 6.2f;

	public void execute() throws MojoExecutionException {
		try {
			if (!isLiferayProject()) {
				return;
			}

			if (getPortalMajorVersion() < PORTAL_VERSION_6_1) {
				throw new MojoExecutionException(
					"Liferay versions below 6.1.0 are not supported");
			}

			initPortalProperties();

			initUtils();

			doExecute();
		}
		catch (Throwable t) {
			if (t instanceof MojoExecutionException) {
				throw (MojoExecutionException)t;
			}
			else {
				throw new MojoExecutionException(t.getMessage(), t);
			}
		}
	}

	protected void addDependencyToClassPath(
			List classPath, Dependency dependency)
		throws Exception {

		URI uri = resolveArtifactFileURI(dependency);

		URL url = uri.toURL();

		classPath.add(url.toString());
	}

	protected void copyLibraryDependencies(File libDir, Artifact artifact)
		throws Exception {

		copyLibraryDependencies(libDir, artifact, false, false, false);
	}

	protected void copyLibraryDependencies(
			File libDir, Artifact artifact, boolean dependencyAddVersion,
			boolean dependencyAddClassifier, boolean copyTransitive)
		throws Exception {

		MavenProject mavenProject = resolveProject(artifact);

		List dependencies = mavenProject.getDependencies();

		for (Dependency dependency : dependencies) {
			String scope = dependency.getScope();

			if (Validator.isNotNull(scope) &&
				(scope.equalsIgnoreCase("provided") ||
				 scope.equalsIgnoreCase("test"))) {

				continue;
			}

			String type = dependency.getType();

			if (type.equalsIgnoreCase("pom")) {
				continue;
			}

			Artifact libArtifact = resolveArtifact(dependency);

			String libJarFileName = libArtifact.getArtifactId();

			if (dependencyAddVersion) {
				if (Validator.isNotNull(libArtifact.getVersion())) {
					libJarFileName += "-" + libArtifact.getVersion();
				}
			}

			if (dependencyAddClassifier) {
				if (Validator.isNotNull(libArtifact.getClassifier())) {
					libJarFileName += "-" + libArtifact.getClassifier();
				}
			}

			File libArtifactFile = libArtifact.getFile();

			libJarFileName +=
				"." + FileUtil.getExtension(libArtifactFile.getName());

			CopyTask.copyFile(
				libArtifactFile, libDir, libJarFileName, null, true, true);

			if (copyTransitive) {
				copyLibraryDependencies(
					libDir, libArtifact, dependencyAddVersion,
					dependencyAddClassifier, copyTransitive);
			}
		}
	}

	protected Dependency createDependency(
		String groupId, String artifactId, String version, String classifier,
		String type) {

		Dependency dependency = new Dependency();

		dependency.setArtifactId(artifactId);
		dependency.setClassifier(classifier);
		dependency.setGroupId(groupId);
		dependency.setType(type);
		dependency.setVersion(version);

		return dependency;
	}

	protected abstract void doExecute() throws Exception;

	protected void executeTool(
			String toolClassName, ClassLoader classLoader, String[] args)
		throws Exception {

		Thread currentThread = Thread.currentThread();

		ClassLoader contextClassLoader = currentThread.getContextClassLoader();

		currentThread.setContextClassLoader(classLoader);

		SecurityManager currentSecurityManager = System.getSecurityManager();

		// Required to prevent premature exit by DBBuilder. See LPS-7524.

		SecurityManager securityManager = new SecurityManager() {

			public void checkPermission(Permission permission) {
			}

			public void checkExit(int status) {
				throw new SecurityException();
			}

		};

		System.setSecurityManager(securityManager);

		try {
			System.setProperty(
				"external-properties",
				"com/liferay/portal/tools/dependencies" +
					"/portal-tools.properties");
			System.setProperty(
				"org.apache.commons.logging.Log",
				"org.apache.commons.logging.impl.Log4JLogger");

			Class clazz = classLoader.loadClass(toolClassName);

			Method method = clazz.getMethod("main", String[].class);

			method.invoke(null, (Object)args);
		}
		catch (InvocationTargetException ite) {
			if (ite.getCause() instanceof SecurityException) {
			}
			else {
				throw ite;
			}
		}
		finally {
			currentThread.setContextClassLoader(contextClassLoader);

			System.clearProperty("org.apache.commons.logging.Log");

			System.setSecurityManager(currentSecurityManager);
		}
	}

	protected float getPortalMajorVersion() {
		float majorVersion = 0;

		Matcher matcher = _majorVersionPattern.matcher(liferayVersion);

		if (matcher.find()) {
			majorVersion = GetterUtil.getFloat(matcher.group(1));
		}

		return majorVersion;
	}

	protected ClassLoader getProjectClassLoader() throws Exception {
		return toClassLoader(getProjectClassPath());
	}

	protected List getProjectClassPath() throws Exception {
		List projectClassPath = new ArrayList();

		projectClassPath.addAll(getToolsClassPath());

		List classPathMavenProjects =
			new ArrayList();

		classPathMavenProjects.add(project);

		for (Object object : project.getDependencyArtifacts()) {
			Artifact artifact = (Artifact)object;

			ArtifactHandler artifactHandler = artifact.getArtifactHandler();

			if (!artifactHandler.isAddedToClasspath()) {
				continue;
			}

			MavenProject dependencyMavenProject = resolveProject(artifact);

			if (dependencyMavenProject == null) {
				continue;
			}

			List compileSourceRoots =
				dependencyMavenProject.getCompileSourceRoots();

			if (compileSourceRoots.isEmpty()) {
				continue;
			}

			getLog().debug(
				"Adding project to class path " + dependencyMavenProject);

			classPathMavenProjects.add(dependencyMavenProject);
		}

		for (MavenProject classPathMavenProject : classPathMavenProjects) {
			for (Object object :
					classPathMavenProject.getCompileClasspathElements()) {

				String path = (String)object;

				getLog().debug("Class path element " + path);

				File file = new File(path);

				URI uri = file.toURI();

				URL url = uri.toURL();

				projectClassPath.add(url.toString());
			}
		}

		getLog().debug("Project class path:");

		for (String path : projectClassPath) {
			getLog().debug("\t" + path);
		}

		return projectClassPath;
	}

	protected ClassLoader getToolsClassLoader() throws Exception {
		return toClassLoader(getToolsClassPath());
	}

	protected List getToolsClassPath() throws Exception {
		List toolsClassPath = new ArrayList();

		if ((appServerLibGlobalDir != null) && appServerLibGlobalDir.exists()) {
			Collection globalJarFiles = FileUtils.listFiles(
				appServerLibGlobalDir, new String[] {"jar"}, false);

			for (File file : globalJarFiles) {
				URI uri = file.toURI();

				URL url = uri.toURL();

				toolsClassPath.add(url.toString());
			}

			Dependency jalopyDependency = createDependency(
				"jalopy", "jalopy", "1.5rc3", "", "jar");

			addDependencyToClassPath(toolsClassPath, jalopyDependency);

			Dependency qdoxDependency = createDependency(
				"com.thoughtworks.qdox", "qdox", "1.12", "", "jar");

			addDependencyToClassPath(toolsClassPath, qdoxDependency);

			ClassLoader globalClassLoader = toClassLoader(toolsClassPath);

			try {
				globalClassLoader.loadClass("javax.activation.MimeType");
			}
			catch (ClassNotFoundException cnfe) {
				Dependency activationDependency = createDependency(
					"javax.activation", "activation", "1.1", "", "jar");

				addDependencyToClassPath(toolsClassPath, activationDependency);
			}

			try {
				globalClassLoader.loadClass("javax.mail.Message");
			}
			catch (ClassNotFoundException cnfe) {
				Dependency mailDependency = createDependency(
					"javax.mail", "mail", "1.4", "", "jar");

				addDependencyToClassPath(toolsClassPath, mailDependency);
			}

			try {
				globalClassLoader.loadClass(
					"com.liferay.portal.kernel.util.ReleaseInfo");
			}
			catch (ClassNotFoundException cnfe) {
				Dependency portalServiceDependency = createDependency(
					"com.liferay.portal", "portal-service", liferayVersion, "",
					"jar");

				addDependencyToClassPath(
					toolsClassPath, portalServiceDependency);
			}

			try {
				globalClassLoader.loadClass("javax.portlet.Portlet");
			}
			catch (ClassNotFoundException cnfe) {
				Dependency portletApiDependency = createDependency(
					"javax.portlet", "portlet-api", "2.0", "", "jar");

				addDependencyToClassPath(toolsClassPath, portletApiDependency);
			}

			try {
				globalClassLoader.loadClass("javax.servlet.ServletRequest");
			}
			catch (ClassNotFoundException cnfe) {
				Dependency servletApiDependency = createDependency(
					"javax.servlet", "servlet-api", "2.5", "", "jar");

				addDependencyToClassPath(toolsClassPath, servletApiDependency);
			}

			try {
				globalClassLoader.loadClass("javax.servlet.jsp.JspPage");
			}
			catch (ClassNotFoundException cnfe) {
				Dependency jspApiDependency = createDependency(
					"javax.servlet.jsp", "jsp-api", "2.1", "", "jar");

				addDependencyToClassPath(toolsClassPath, jspApiDependency);
			}
		}
		else {
			Dependency jalopyDependency = createDependency(
				"jalopy", "jalopy", "1.5rc3", "", "jar");

			addDependencyToClassPath(toolsClassPath, jalopyDependency);

			Dependency qdoxDependency = createDependency(
				"com.thoughtworks.qdox", "qdox", "1.12", "", "jar");

			addDependencyToClassPath(toolsClassPath, qdoxDependency);

			Dependency activationDependency = createDependency(
				"javax.activation", "activation", "1.1", "", "jar");

			addDependencyToClassPath(toolsClassPath, activationDependency);

			Dependency mailDependency = createDependency(
				"javax.mail", "mail", "1.4", "", "jar");

			addDependencyToClassPath(toolsClassPath, mailDependency);

			Dependency portalServiceDependency = createDependency(
				"com.liferay.portal", "portal-service", liferayVersion, "",
				"jar");

			addDependencyToClassPath(toolsClassPath, portalServiceDependency);

			Dependency portletApiDependency = createDependency(
				"javax.portlet", "portlet-api", "2.0", "", "jar");

			addDependencyToClassPath(toolsClassPath, portletApiDependency);

			Dependency servletApiDependency = createDependency(
				"javax.servlet", "servlet-api", "2.5", "", "jar");

			addDependencyToClassPath(toolsClassPath, servletApiDependency);

			Dependency jspApiDependency = createDependency(
				"javax.servlet.jsp", "jsp-api", "2.1", "", "jar");

			addDependencyToClassPath(toolsClassPath, jspApiDependency);
		}

		Collection portalJarFiles = FileUtils.listFiles(
			appServerLibPortalDir, new String[] {"jar"}, false);

		for (File file : portalJarFiles) {
			URI uri = file.toURI();

			URL url = uri.toURL();

			toolsClassPath.add(url.toString());
		}

		getLog().debug("Tools class path:");

		for (String path : toolsClassPath) {
			getLog().debug("\t" + path);
		}

		return toolsClassPath;
	}

	protected void initPortalProperties() throws Exception {
		if (((appServerPortalDir == null) || !appServerPortalDir.exists()) &&
			Validator.isNotNull(liferayVersion)) {

			appServerPortalDir = new File(workDir, "appServerPortalDir");

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

			Dependency dependency = createDependency(
				"com.liferay.portal", "portal-web", liferayVersion, "", "war");

			Artifact artifact = resolveArtifact(dependency);

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

			unArchiver.setDestDirectory(appServerPortalDir);

			unArchiver.setOverwrite(false);
			unArchiver.setSourceFile(artifact.getFile());

			unArchiver.extract();
		}

		if ((appServerPortalDir != null) && appServerPortalDir.exists()) {
			if (appServerClassesPortalDir == null) {
				appServerClassesPortalDir = new File(
					appServerPortalDir, "WEB-INF/classes");
			}

			if (appServerLibPortalDir == null) {
				appServerLibPortalDir = new File(
					appServerPortalDir, "WEB-INF/lib");
			}

			if (appServerTldPortalDir == null) {
				appServerTldPortalDir = new File(
					appServerPortalDir, "WEB-INF/tld");
			}
		}
	}

	protected void initUtils() throws Exception {
		ClassLoader classLoader = getToolsClassLoader();

		Class clazz = classLoader.loadClass(
			"com.liferay.portal.util.EntityResolver");

		EntityResolver entityResolver = (EntityResolver)clazz.newInstance();

		SAXReaderUtil.setEntityResolver(entityResolver);
	}

	protected boolean isLiferayProject() {
		String packaging = project.getPackaging();

		if (packaging.equals("pom")) {
			getLog().info("Skipping " + project.getArtifactId());

			return false;
		}

		return true;
	}

	protected Artifact resolveArtifact(Dependency dependency) throws Exception {
		Artifact artifact = null;

		if (Validator.isNull(dependency.getClassifier())) {
			artifact = artifactFactory.createArtifact(
				dependency.getGroupId(), dependency.getArtifactId(),
				dependency.getVersion(), dependency.getScope(),
				dependency.getType());
		}
		else {
			artifact = artifactFactory.createArtifactWithClassifier(
				dependency.getGroupId(), dependency.getArtifactId(),
				dependency.getVersion(), dependency.getType(),
				dependency.getClassifier());
		}

		artifactResolver.resolve(
			artifact, remoteArtifactRepositories, localArtifactRepository);

		return artifact;
	}

	protected URI resolveArtifactFileURI(Dependency dependency)
		throws Exception {

		Artifact artifact = resolveArtifact(dependency);

		File file = artifact.getFile();

		return file.toURI();
	}

	protected MavenProject resolveProject(Artifact artifact) throws Exception {
		Artifact pomArtifact = artifact;

		String type = artifact.getType();

		if (!type.equals("pom")) {
			pomArtifact = artifactFactory.createArtifact(
				artifact.getGroupId(), artifact.getArtifactId(),
				artifact.getVersion(), "", "pom");
		}

		return projectBuilder.buildFromRepository(
			pomArtifact, remoteArtifactRepositories, localArtifactRepository);
	}

	protected ClassLoader toClassLoader(List classPath)
		throws Exception {

		List urls = new ArrayList();

		for (String path : classPath) {
			urls.add(new URL(path));
		}

		return new URLClassLoader(urls.toArray(new URL[urls.size()]), null);
	}

	protected static boolean initialized;

	/**
	 * @parameter expression="${appServerClassesPortalDir}"
	 */
	protected File appServerClassesPortalDir;

	/**
	 * @parameter expression="${appServerLibGlobalDir}"
	 */
	protected File appServerLibGlobalDir;

	/**
	 * @parameter expression="${appServerLibPortalDir}"
	 */
	protected File appServerLibPortalDir;

	/**
	 * @parameter expression="${appServerPortalDir}"
	 */
	protected File appServerPortalDir;

	/**
	 * @parameter expression="${appServerTldPortalDir}"
	 */
	protected File appServerTldPortalDir;

	/**
	 * @component
	 */
	protected ArchiverManager archiverManager;

	/**
	 * @component
	 */
	protected ArtifactFactory artifactFactory;

	/**
	 * @component
	 */
	protected ArtifactResolver artifactResolver;

	/**
	 * @parameter expression="${liferayVersion}"
	 */
	protected String liferayVersion;

	/**
	 * @parameter expression="${localRepository}"
	 * @readonly
	 * @required
	 */
	protected ArtifactRepository localArtifactRepository;

	/**
	 * @parameter default-value="portlet" expression="${pluginType}"
	 * @required
	 */
	protected String pluginType;

	/**
	 * @parameter expression="${project}"
	 * @required
	 * @readonly
	 */
	protected MavenProject project;

	/**
	 * @component role="org.apache.maven.project.MavenProjectBuilder"
	 * @required
	 * @readonly
	 */
	protected MavenProjectBuilder projectBuilder;

	/**
	 * @parameter expression="${project.remoteArtifactRepositories}"
	 * @readonly
	 * @required
	 */
	protected List remoteArtifactRepositories;

	/**
	 * @parameter default-value="${project.build.directory}/liferay-work"
	 * @required
	 */
	protected File workDir;

	private static Pattern _majorVersionPattern = Pattern.compile(
		"(\\d+[.]\\d+)");

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy