/* * 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); } } }