com.android.ide.eclipse.cheatsheets.actions.ImportProject.java Source code

Java tutorial

Introduction

Here is the source code for com.android.ide.eclipse.cheatsheets.actions.ImportProject.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2010 SnPe Informacioni Sistemi.
 * 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
 *
 * Contributors:
 *     SnPe Informacioni sistemi - initial API and implementation
 *******************************************************************************/
package com.android.ide.eclipse.cheatsheets.actions;

import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.cheatsheets.Activator;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.SdkConstants;
import com.android.sdklib.internal.project.ProjectProperties;
import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.cheatsheets.ICheatSheetAction;
import org.eclipse.ui.cheatsheets.ICheatSheetManager;
import org.eclipse.ui.dialogs.IOverwriteQuery;
import org.eclipse.ui.wizards.datatransfer.ImportOperation;
import org.eclipse.ui.wizards.datatransfer.ZipFileStructureProvider;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class ImportProject extends Action implements ICheatSheetAction {

    private static boolean overwrite;

    private static Shell shell;

    private static final IOverwriteQuery OVERWRITE_ALL_QUERY = new IOverwriteQuery() {
        public String queryOverwrite(String pathString) {
            return IOverwriteQuery.ALL;
        }
    };

    public void run(String[] params, ICheatSheetManager manager) {
        if (params == null || params[0] == null || params[1] == null) {
            return;
        }

        importProject(params[0], params, manager);
    }

    private void importProject(final String projectURL, final String[] params, final ICheatSheetManager manager) {
        final String projectName = params[1];
        WorkspaceJob workspaceJob = new WorkspaceJob("Importing projects ...") {

            @Override
            public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
                IWorkspace workspace = ResourcesPlugin.getWorkspace();
                IProject project = workspace.getRoot().getProject(projectName);
                if (project.exists()) {
                    Display.getDefault().syncExec(new Runnable() {

                        public void run() {
                            overwrite = MessageDialog.openQuestion(getShell(), "Question",
                                    "Overwrite project " + projectName);
                        }

                    });
                    if (!overwrite) {
                        return Status.CANCEL_STATUS;
                    }
                    project.delete(true, true, monitor);
                }
                InputStream in = null;
                OutputStream out = null;
                File file = null;
                try {
                    URL url = new URL(projectURL);
                    URL entry = FileLocator.resolve(url);
                    file = File.createTempFile("HelloWorld", ".zip"); //$NON-NLS-1$//$NON-NLS-2$
                    file.deleteOnExit();
                    in = entry.openStream();
                    out = new FileOutputStream(file);
                    copy(in, out);
                } catch (MalformedURLException e) {
                    Activator.log(e);
                    return Status.CANCEL_STATUS;
                } catch (IOException e) {
                    Activator.log(e);
                    return Status.CANCEL_STATUS;
                } finally {
                    if (in != null) {
                        try {
                            in.close();
                        } catch (IOException e) {
                            // ignore
                        }
                    }
                    if (out != null) {
                        try {
                            out.close();
                        } catch (IOException e) {
                            // ignore
                        }
                    }
                }
                project.create(monitor);
                project.open(monitor);
                ZipFile sourceFile;
                try {
                    sourceFile = new ZipFile(file);
                } catch (IOException e) {
                    Activator.log(e);
                    return Status.CANCEL_STATUS;
                }
                ZipFileStructureProvider structureProvider = new ZipFileStructureProvider(sourceFile);

                Enumeration<? extends ZipEntry> entries = sourceFile.entries();
                ZipEntry entry = null;
                List<ZipEntry> filesToImport = new ArrayList<ZipEntry>();
                String prefix = projectName + "/"; //$NON-NLS-1$
                while (entries.hasMoreElements()) {
                    entry = entries.nextElement();
                    if (entry.getName().startsWith(prefix)) {
                        filesToImport.add(entry);
                    }
                }

                ImportOperation operation = new ImportOperation(workspace.getRoot().getFullPath(),
                        structureProvider.getRoot(), structureProvider, OVERWRITE_ALL_QUERY, filesToImport);
                operation.setContext(getShell());
                try {
                    operation.run(new NullProgressMonitor());
                } catch (InvocationTargetException e) {
                    Activator.log(e);
                    return Status.CANCEL_STATUS;
                } catch (InterruptedException e) {
                    Activator.log(e);
                    return Status.CANCEL_STATUS;
                } finally {
                    file.delete();
                }
                return Status.OK_STATUS;
            }

        };
        workspaceJob.setUser(true);

        workspaceJob.addJobChangeListener(new IJobChangeListener() {

            public void aboutToRun(IJobChangeEvent event) {

            }

            public void awake(IJobChangeEvent event) {

            }

            public void done(IJobChangeEvent event) {
                try {
                    Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, new NullProgressMonitor());
                    IWorkspace workspace = ResourcesPlugin.getWorkspace();
                    IProject project = workspace.getRoot().getProject(projectName);
                    Sdk currentSdk = Sdk.getCurrent();
                    if (currentSdk != null && project.isOpen()) {
                        IJavaProject javaProject = JavaCore.create(project);
                        ProjectState state = Sdk.getProjectState(project);
                        IAndroidTarget projectTarget = state.getTarget();
                        if (projectTarget == null) {
                            IAndroidTarget[] targets = Sdk.getCurrent().getTargets();
                            if (targets != null && targets.length > 0) {
                                IAndroidTarget newTarget = targets[0];
                                ProjectPropertiesWorkingCopy mPropertiesWorkingCopy = state.getProperties()
                                        .makeWorkingCopy();
                                mPropertiesWorkingCopy.setProperty(ProjectProperties.PROPERTY_TARGET,
                                        newTarget.hashString());
                                try {
                                    mPropertiesWorkingCopy.save();
                                    IResource defaultProp = project.findMember(SdkConstants.FN_DEFAULT_PROPERTIES);
                                    defaultProp.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());

                                    ProjectHelper.fixProject(project);
                                } catch (Exception e) {
                                    String msg = String.format("Failed to save %1$s for project %2$s",
                                            SdkConstants.FN_DEFAULT_PROPERTIES, project.getName());
                                    AdtPlugin.log(e, msg);
                                }
                            } else {
                                Display.getDefault().syncExec(new Runnable() {

                                    public void run() {
                                        MessageDialog.openInformation(getShell(), "Hello World target",
                                                "'Hello world' cheatsheet requires "
                                                        + "an Android target. You can download "
                                                        + "them using the 'Open SDK and AVD Manager'" + " action.");
                                    }
                                });
                            }
                        }
                    }
                    Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, new NullProgressMonitor());
                    if (params[2] != null) {
                        new OpenFile().run(new String[] { params[1], "src", params[2] }, manager);
                    }
                } catch (OperationCanceledException e) {
                    Activator.log(e);
                } catch (InterruptedException e) {
                    Activator.log(e);
                }
            }

            public void running(IJobChangeEvent event) {

            }

            public void scheduled(IJobChangeEvent event) {

            }

            public void sleeping(IJobChangeEvent event) {

            }

        });
        workspaceJob.schedule();
    }

    private void copy(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[16 * 1024];
        int len;
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
    }

    private static Shell getShell() {
        Display display = Display.getDefault();
        shell = null;
        display.syncExec(new Runnable() {

            public void run() {
                shell = Display.getCurrent().getActiveShell();
            }

        });
        return shell;
    }
}