/** * Copyright (c) 2010, 2014 Darmstadt University of Technology. * 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: * Andreas Sewe - initial API and implementation */ package org.eclipse.recommenders.coordinates.jre; import static com.google.common.base.Optional.absent; import static java.lang.Integer.parseInt; import static org.apache.commons.lang3.StringUtils.removeStart; import java.io.File; import org.eclipse.recommenders.coordinates.AbstractProjectCoordinateAdvisor; import org.eclipse.recommenders.coordinates.Coordinates; import org.eclipse.recommenders.coordinates.DependencyInfo; import org.eclipse.recommenders.coordinates.DependencyType; import org.eclipse.recommenders.coordinates.ProjectCoordinate; import org.eclipse.recommenders.utils.Versions; import com.google.common.base.Optional; public class AndroidDirectoryNameAdvisor extends AbstractProjectCoordinateAdvisor { private static final String GROUP_ID = "com.google.android"; private static final String ARTIFACT_ID = "android"; private static final String ANDROID_TARGET_PREFIX = "android-"; /** * @see <a href="https://developer.android.com/reference/android/os/Build.VERSION_CODES.html">Android Version * Codes</a> */ private static final String[] VERSION_CODES = new String[] { null, // No API 0 "1.0", // API 1 "1.1", // API 2 "1.5", // API 3: Cupcake "1.6", // API 4: Donut "2.0", // API 5: Eclair "2.0.1", // API 6: Eclair "2.1", // API 7: Eclair "2.2", // API 8: Froyo "2.3", // API 9: Gingerbread "2.3.3", // API 10: Gingerbread "3.0", // API 11: Honeycomb "3.1", // API 12: Honeycomb "3.2", // API 13: Honeycomb "4.0", // API 14: Ice Cream Sandwich "4.0.3", // API 15: Ice Cream Sandwich "4.1", // API 16: Jelly Bean "4.2", // API 17: Jelly Bean "4.3", // API 18: Jelly Bean "4.4", // API 19: Kit Kat "4.5", // API 20: Kit Kat Watch (technically 4.4W) "5.0", // API 21: Lollipop "5.1", // API 22: Lollipop MR1 "6.0", // API 23: M (Marshmallow) }; @Override protected boolean isApplicable(DependencyType type) { return type == DependencyType.JAR; } @Override protected Optional<ProjectCoordinate> doSuggest(DependencyInfo dependencyInfo) { File jar = dependencyInfo.getFile(); if (!"android.jar".equals(jar.getName())) { return absent(); } File directory = jar.getParentFile(); if (directory == null) { return absent(); } return asProjectCoordinate(directory.getName()); } private Optional<ProjectCoordinate> asProjectCoordinate(String target) { try { int apiVersion = extractApiVersion(target); if (apiVersion < 1 || apiVersion >= VERSION_CODES.length) { return absent(); } String version = Versions.canonicalizeVersion(VERSION_CODES[apiVersion]); return Coordinates.tryNewProjectCoordinate(GROUP_ID, ARTIFACT_ID, version); } catch (IllegalArgumentException e) { return absent(); } } private int extractApiVersion(String target) { if (target.startsWith(ANDROID_TARGET_PREFIX)) { return parseInt(removeStart(target, ANDROID_TARGET_PREFIX)); } else { throw new IllegalArgumentException("Cannot extract API version: " + target); } } }