/* * Copyright 2000-2010 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License 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 org.jetbrains.android.maven; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.LibraryOrderEntry; import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.model.MavenConstants; import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; import java.util.Collection; import java.util.List; /** * @author Eugene.Kudelevsky */ public class AndroidMavenUtil { private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.maven.AndroidMavenUtil"); @NonNls public static final String APKSOURCES_DEPENDENCY_TYPE = "apksources"; @NonNls public static final String APKLIB_DEPENDENCY_AND_PACKAGING_TYPE = "apklib"; @NonNls public static final String SO_PACKAGING_AND_DEPENDENCY_TYPE = "so"; @NonNls public static final String APK_PACKAGING_TYPE = "apk"; @NonNls public static final String AAR_DEPENDENCY_AND_PACKAGING_TYPE = "aar"; @NonNls public static final String APK_LIB_ARTIFACT_SOURCE_ROOT = "src"; @NonNls public static final String APK_LIB_ARTIFACT_RES_DIR = "res"; public static final String APK_LIB_ARTIFACT_NATIVE_LIBS_DIR = "libs"; public static final String APK_LIB_ARTIFACT_MANIFEST_FILE = "AndroidManifest.xml"; @NonNls private static final String APKLIB_MODULE_PREFIX = "~apklib-"; @NonNls private static final String GEN_EXTERNAL_APKLIBS_DIRNAME = "gen-external-apklibs"; private AndroidMavenUtil() { } @Nullable public static String computePathForGenExternalApklibsDir(@NotNull MavenId mavenId, @NotNull MavenProject project, @NotNull Collection<MavenProject> allProjects) { String path = null; boolean resultUnderApp = false; for (MavenProject p : allProjects) { List<MavenArtifact> dependencies = p.findDependencies(mavenId); if (dependencies.size() == 0) { dependencies = p.findDependencies(mavenId.getGroupId(), mavenId.getArtifactId()); } if (dependencies.size() > 0 && containsCompileDependency(dependencies)) { final VirtualFile projectDir = p.getDirectoryFile(); final boolean app = APK_PACKAGING_TYPE.equals(p.getPackaging()); if (path == null || !resultUnderApp && app) { path = projectDir.getPath() + '/' + GEN_EXTERNAL_APKLIBS_DIRNAME; resultUnderApp = app; } } } if (path == null) { path = getGenExternalApklibDirInProject(project); } return path; } @NotNull public static String getGenExternalApklibDirInProject(@NotNull MavenProject project) { return project.getDirectoryFile().getPath() + '/' + GEN_EXTERNAL_APKLIBS_DIRNAME; } private static boolean containsCompileDependency(Collection<MavenArtifact> dependencies) { for (MavenArtifact dependency : dependencies) { if (MavenConstants.SCOPE_COMPILE.equals(dependency.getScope())) { return true; } } return false; } @NotNull public static String getModuleNameForExtApklibArtifact(MavenId mavenId) { return APKLIB_MODULE_PREFIX + getMavenIdStringForFileName(mavenId); } @Nullable public static String getMavenIdStringByExtApklibModule(@NotNull Module module) { final String moduleName = module.getName(); if (!moduleName.startsWith(APKLIB_MODULE_PREFIX)) { return null; } return moduleName.substring(APKLIB_MODULE_PREFIX.length()); } public static boolean isExtApklibModule(@NotNull Module module) { return module.getName().startsWith(APKLIB_MODULE_PREFIX); } @NotNull public static String getMavenIdStringForFileName(@NotNull MavenId mavenId) { final String artifactId = mavenId.getKey().replace(':', '_'); return artifactId != null ? artifactId : "null"; } public static boolean isMavenizedModule(@NotNull Module module) { AndroidMavenProvider mavenProxy = getMavenProvider(); return mavenProxy != null && mavenProxy.isMavenizedModule(module); } public static boolean isMavenAarDependency(@NotNull Module module, @NotNull OrderEntry entry) { if (ApplicationManager.getApplication().isUnitTestMode() && entry.getPresentableName().equals("maven_aar_dependency")) { return true; } if (!(entry instanceof LibraryOrderEntry) || !isMavenizedModule(module)) { return false; } final Library library = ((LibraryOrderEntry)entry).getLibrary(); if (library == null) { return false; } final MavenProject mavenProject = MavenProjectsManager.getInstance(module.getProject()).findProject(module); if (mavenProject == null) { return false; } final MavenArtifact artifact = MavenRootModelAdapter.findArtifact(mavenProject, library); return artifact != null && AAR_DEPENDENCY_AND_PACKAGING_TYPE.equals(artifact.getType()); } @Nullable public static AndroidMavenProvider getMavenProvider() { return ArrayUtil.getFirstElement(AndroidMavenProvider.EP_NAME.getExtensions()); } }