com.amazonaws.eclipse.android.sdk.classpath.AndroidSdkClasspathContainerInitializer.java Source code

Java tutorial

Introduction

Here is the source code for com.amazonaws.eclipse.android.sdk.classpath.AndroidSdkClasspathContainerInitializer.java

Source

/*
 * Copyright 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
package com.amazonaws.eclipse.android.sdk.classpath;

import java.io.File;
import java.io.IOException;
import java.net.URL;

import org.apache.commons.io.FileUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.ClasspathContainerInitializer;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.ui.statushandlers.StatusManager;
import org.osgi.framework.Bundle;

import com.amazonaws.eclipse.android.sdk.AndroidSDKPlugin;
import com.amazonaws.eclipse.android.sdk.AndroidSdkInstall;
import com.amazonaws.eclipse.android.sdk.AndroidSdkManager;
import com.amazonaws.eclipse.android.sdk.AndroidSdkManager.AndroidSdkInstallFactory;
import com.amazonaws.eclipse.sdk.ui.JavaSdkPlugin;
import com.amazonaws.eclipse.sdk.ui.SdkProjectMetadata;

public class AndroidSdkClasspathContainerInitializer extends ClasspathContainerInitializer {

    @Override
    public void initialize(IPath containerPath, IJavaProject javaProject) throws CoreException {
        try {
            SdkProjectMetadata sdkProjectMetadataFile = new SdkProjectMetadata(javaProject.getProject());
            File sdkInstallRoot = sdkProjectMetadataFile.getSdkInstallRootForProject();

            if (sdkInstallRoot == null)
                throw new Exception("No SDK install directory specified");

            AndroidSdkInstall sdkInstall = new AndroidSdkInstallFactory().createSdkInstallFromDisk(sdkInstallRoot);

            if (sdkInstall.isValidSdkInstall() == false)
                throw new Exception("Invalid SDK install directory specified: " + sdkInstall.getRootDirectory());

            copySdkJarToProject(javaProject.getProject(), sdkInstall);

            AndroidSdkClasspathContainer classpathContainer = new AndroidSdkClasspathContainer(sdkInstall,
                    javaProject.getProject());
            JavaCore.setClasspathContainer(containerPath, new IJavaProject[] { javaProject },
                    new IClasspathContainer[] { classpathContainer }, null);
        } catch (Exception e) {
            AndroidSdkInstall defaultSdkInstall = AndroidSdkManager.getInstance().getDefaultSdkInstall();
            if (defaultSdkInstall == null)
                throw new CoreException(new Status(IStatus.ERROR, JavaSdkPlugin.PLUGIN_ID, "No SDKs available"));

            AndroidSdkClasspathContainer classpathContainer = new AndroidSdkClasspathContainer(defaultSdkInstall,
                    javaProject.getProject());
            JavaCore.setClasspathContainer(containerPath, new IJavaProject[] { javaProject },
                    new IClasspathContainer[] { classpathContainer }, null);
            try {
                defaultSdkInstall.writeMetadataToProject(javaProject);
            } catch (IOException ioe) {
                StatusManager.getManager().handle(
                        new Status(Status.WARNING, JavaSdkPlugin.PLUGIN_ID, ioe.getMessage(), ioe),
                        StatusManager.LOG);
            }

            String message = "Unable to initialize previous AWS SDK for Android classpath entries - defaulting to latest version";
            Status status = new Status(Status.WARNING, JavaSdkPlugin.PLUGIN_ID, message, e);
            StatusManager.getManager().handle(status, StatusManager.LOG);
        }
    }

    private void copySdkJarToProject(IProject project, AndroidSdkInstall sdkInstall) {
        try {
            File sdkJar = sdkInstall.getSdkJar();

            File projectRoot = project.getLocation().toFile();
            File libsDirectory = new File(projectRoot, "libs");
            if (libsDirectory.exists() == false) {
                if (!libsDirectory.mkdir())
                    throw new Exception("Unable to create project libs directory");
            }

            if (libsDirectory.isDirectory() == false) {
                throw new Exception("Project contains a non-directory file named 'libs' already");
            }

            File destinationFile = new File(libsDirectory, sdkJar.getName());
            if (!destinationFile.exists()) {
                FileUtils.copyFile(sdkJar, destinationFile);
                project.refreshLocal(IResource.DEPTH_ONE, null);
            }
        } catch (Exception e) {
            IStatus status = new Status(IStatus.ERROR, AndroidSDKPlugin.PLUGIN_ID,
                    "Unable to copy AWS SDK for Android jar to project's lib directory", e);
            StatusManager.getManager().handle(status, StatusManager.SHOW | StatusManager.LOG);
        }
    }
}