com.liferay.ide.maven.core.MavenBundlePluginProject.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.ide.maven.core.MavenBundlePluginProject.java

Source

/*******************************************************************************
 * 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.ide.maven.core;

import com.liferay.ide.core.IBundleProject;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.FileUtil;
import com.liferay.ide.maven.core.util.DefaultMaven2OsgiConverter;
import com.liferay.ide.project.core.IProjectBuilder;
import com.liferay.ide.project.core.util.ProjectUtil;
import com.liferay.ide.server.remote.IRemoteServerPublisher;

import java.io.File;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.m2e.core.project.IMavenProjectFacade;

/**
 * @author Gregory Amerson
 */
public class MavenBundlePluginProject extends LiferayMavenProject implements IBundleProject {
    private final String[] ignorePaths = new String[] { "target" };

    public MavenBundlePluginProject(IProject project) {
        super(project);
    }

    public <T> T adapt(Class<T> adapterType) {
        T adapter = super.adapt(adapterType);

        if (adapter != null) {
            return adapter;
        }

        final IMavenProjectFacade facade = MavenUtil.getProjectFacade(getProject(), new NullProgressMonitor());

        if (facade != null) {
            if (IProjectBuilder.class.equals(adapterType)) {
                final IProjectBuilder projectBuilder = new MavenProjectBuilder(getProject());

                return adapterType.cast(projectBuilder);
            } else if (IRemoteServerPublisher.class.equals(adapterType)) {
                final IRemoteServerPublisher remoteServerPublisher = new MavenProjectRemoteServerPublisher(
                        getProject());

                return adapterType.cast(remoteServerPublisher);
            } else if (IBundleProject.class.equals(adapterType)) {
                return adapterType.cast(this);
            }
        }

        return null;
    }

    @Override
    public String getBundleShape() {
        return "jar";
    }

    @Override
    public IFile getDescriptorFile(String name) {
        return getProject().getFile(name);
    }

    @Override
    public IPath getOutputBundle(boolean cleanBuild, IProgressMonitor monitor) throws CoreException {
        IPath outputJar = null;

        final IMavenProjectFacade projectFacade = MavenUtil.getProjectFacade(getProject(), monitor);
        final MavenProjectBuilder mavenProjectBuilder = new MavenProjectBuilder(this.getProject());

        // IDE-3009 delete the MANIFEST.MF to ensure that it will be regenerated by bnd-process

        IFile manifest = this.getProject().getFile("target/classes/META-INF/MANIFEST.MF");

        if (manifest.exists()) {
            manifest.delete(true, monitor);
        }

        if (cleanBuild || !isAutoBuild()) {
            this.getProject().build(IncrementalProjectBuilder.CLEAN_BUILD, monitor);
            this.getProject().build(IncrementalProjectBuilder.FULL_BUILD, monitor);
        }

        mavenProjectBuilder.execJarMojo(projectFacade, monitor);

        final MavenProject mavenProject = projectFacade.getMavenProject(monitor);

        final String targetName = mavenProject.getBuild().getFinalName() + ".jar";

        final String buildDirectory = mavenProject.getBuild().getDirectory();
        final File baseDirectory = mavenProject.getBasedir();

        final IPath buildDirPath = new Path(buildDirectory);
        final IPath baseDirPath = new Path(baseDirectory.toString());

        final IPath relativePath = buildDirPath.makeRelativeTo(baseDirPath);

        final IFolder targetFolder = getTargetFolder(getProject(), relativePath);

        if (targetFolder.exists()) {
            // targetFolder.refreshLocal( IResource.DEPTH_ONE, monitor );
            final IPath targetFile = targetFolder.getRawLocation().append(targetName);

            if (targetFile.toFile().exists()) {
                outputJar = targetFile;
            }
        }

        return outputJar;
    }

    private boolean isAutoBuild() {
        return ResourcesPlugin.getWorkspace().getDescription().isAutoBuilding();
    }

    private IFolder getTargetFolder(IProject project, IPath relativePath) {
        IFolder targetFolder = project.getFolder(relativePath);

        if (!targetFolder.exists()) {
            targetFolder = project.getFolder("target");
        }

        return targetFolder;
    }

    @Override
    public String getSymbolicName() throws CoreException {
        String bsn = ProjectUtil.getBundleSymbolicNameFromBND(getProject());

        if (!CoreUtil.empty(bsn)) {
            return bsn;
        }

        String retval = null;

        final IProgressMonitor monitor = new NullProgressMonitor();
        final IMavenProjectFacade projectFacade = MavenUtil.getProjectFacade(getProject(), monitor);
        final MavenProject mavenProject = projectFacade.getMavenProject(monitor);

        final Artifact artifact = mavenProject.getArtifact();
        final File file = artifact.getFile();

        if (file != null && file.exists() && !artifact.getFile().getName().equals("classes")) {
            retval = new DefaultMaven2OsgiConverter().getBundleSymbolicName(artifact);
        } else {
            // fallback to project name
            retval = getProject().getLocation().lastSegment();
        }

        return retval;
    }

    @Override
    public boolean filterResource(IPath resourcePath) {
        if (filterResource(resourcePath, ignorePaths)) {
            return true;
        }

        return false;
    }

    @Override
    public boolean isFragmentBundle() {
        final IFile bndFile = getProject().getFile("bnd.bnd");

        if (bndFile.exists()) {
            try {
                String content = FileUtil.readContents(bndFile.getContents());

                if (content.contains("Fragment-Host")) {
                    return true;
                }
            } catch (Exception e) {
            }
        }

        return false;
    }

}