me.gladwell.eclipse.m2e.android.quickfix.UnzipApkLibsDependciesSupport.java Source code

Java tutorial

Introduction

Here is the source code for me.gladwell.eclipse.m2e.android.quickfix.UnzipApkLibsDependciesSupport.java

Source

/*******************************************************************************
 * Copyright (c) 2012 Tomas Prochazka
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/

package me.gladwell.eclipse.m2e.android.quickfix;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarFile;

import me.gladwell.eclipse.m2e.android.configuration.DependencyNotFoundInWorkspace;
import me.gladwell.eclipse.m2e.android.project.AndroidProjectFactory;
import me.gladwell.eclipse.m2e.android.project.AndroidWorkspace;
import me.gladwell.eclipse.m2e.android.project.Dependency;
import me.gladwell.eclipse.m2e.android.project.EclipseAndroidProject;
import me.gladwell.eclipse.m2e.android.project.JaywayMavenAndroidProject;
import me.gladwell.eclipse.m2e.android.project.MavenAndroidProject;
import me.gladwell.eclipse.m2e.android.project.MavenDependency;
import me.gladwell.eclipse.m2e.android.util.JarHelper;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Model;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.FileUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.MavenModelManager;
import org.eclipse.m2e.core.project.MavenProjectInfo;
import org.eclipse.m2e.core.project.ProjectImportConfiguration;

import com.google.inject.Inject;

/**
 * This class allow unpack and import one or more apklibs dependencies to workspace.
 * 
 * @author Tom Prochzka &lt;<a href="mailto:tomas.prochazka@gmail.com">tomas.prochazka@gmail.com</a>&gt;
 */
public class UnzipApkLibsDependciesSupport {

    private IWorkspace workspace;
    private MavenModelManager mavenModelManager;
    private AndroidProjectFactory<EclipseAndroidProject, IProject> projectFactory;
    private AndroidWorkspace androidWorkspace;

    private File targetFolder;
    private ArrayList<MavenProjectInfo> mavenProjectsInfo;

    @Inject
    public UnzipApkLibsDependciesSupport(IWorkspace workspace, MavenModelManager mavenModelManager,
            AndroidProjectFactory<MavenAndroidProject, MavenProject> mavenProjectFactory,
            AndroidProjectFactory<EclipseAndroidProject, IProject> projectFactory,
            AndroidProjectFactory<MavenAndroidProject, EclipseAndroidProject> projectConverter,
            AndroidWorkspace androidWorkspace) {
        super();
        this.workspace = workspace;
        this.mavenModelManager = mavenModelManager;
        this.projectFactory = projectFactory;
        this.androidWorkspace = androidWorkspace;

        mavenProjectsInfo = new ArrayList<MavenProjectInfo>();
    }

    public void process(IProject iProject, Dependency apkLibDependency) throws CoreException, IOException {
        Artifact d = MavenPlugin.getMaven().resolve(apkLibDependency.getGroupId(), apkLibDependency.getArtifactId(),
                apkLibDependency.getVersion(), apkLibDependency.getType(), null, null, null);
        unpack(d);
        importProjects();
        updateProjectConfig(iProject);
    }

    protected void updateProjectConfig(IProject iProject) {
        EclipseAndroidProject androidProject = projectFactory.createAndroidProject(iProject);
        androidProject.setLibrary(true);
        androidProject.fixProject();
    }

    public void processAll(IProject iProject) throws CoreException, IOException {
        EclipseAndroidProject androidProject = projectFactory.createAndroidProject(iProject);
        Model mavenModel = mavenModelManager.readMavenModel(androidProject.getPom());
        MavenProject mavenProject = new MavenProject(mavenModel);

        List<org.apache.maven.model.Dependency> dep = mavenProject.getDependencies();

        for (org.apache.maven.model.Dependency dependency : dep) {
            if (dependency.getType().equals(JaywayMavenAndroidProject.ANDROID_LIBRARY_PACKAGE_TYPE)) {
                try {
                    androidWorkspace.findOpenWorkspaceDependency(new MavenDependency(dependency));
                } catch (DependencyNotFoundInWorkspace ex) {
                    Artifact d = MavenPlugin.getMaven().resolve(dependency.getGroupId(), dependency.getArtifactId(),
                            dependency.getVersion(), dependency.getType(), null, null, null);
                    unpack(d);
                    importProjects();
                    updateProjectConfig(iProject);
                }
            }
        }
    }

    public void unpack(Artifact artifact) throws IOException, CoreException {
        File path = getTargetPath();
        targetFolder = new File(path,
                artifact.getGroupId() + "-" + artifact.getArtifactId() + "-" + artifact.getVersion());
        targetFolder.mkdirs();

        File apklibFile = artifact.getFile();
        File pomFile = new File(artifact.getFile().toString()
                .replace(JaywayMavenAndroidProject.ANDROID_LIBRARY_PACKAGE_TYPE, "pom"));
        File targetPomFile = new File(targetFolder, "pom.xml");

        // unpack project itself
        JarHelper.unjar(new JarFile(apklibFile), targetFolder, null);
        // add pom.xml
        FileUtils.copyFile(pomFile, targetPomFile);
        // create project.properties file
        // TODO: Detect right android API version
        int apiVersion = 16;
        FileUtils.fileWrite(new File(targetFolder, "project.properties"),
                "android.library=true\n# Project target.\ntarget=android-" + apiVersion);

        Model model = mavenModelManager.readMavenModel(targetPomFile);

        // check if pom require test folder
        String testSource = model.getBuild().getTestSourceDirectory();
        if (testSource != null && !testSource.isEmpty()) {
            new File(targetFolder, testSource).mkdirs();
        }

        MavenProjectInfo i = new MavenProjectInfo("project", targetPomFile, model, null);
        mavenProjectsInfo.add(i);
    }

    public void importProjects() throws CoreException {
        ProjectImportConfiguration config = new ProjectImportConfiguration();
        config.setProjectNameTemplate("apklib-[groupId].[artifactId]-[version]");
        MavenPlugin.getProjectConfigurationManager().importProjects(mavenProjectsInfo, config,
                new NullProgressMonitor());
    }

    public File getTargetPath() {
        File target = workspace.getRoot().getLocation().toFile();
        return new File(target, "apklibs");
    }

}