| /* |
| * 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.android.SdkConstants; |
| import com.intellij.openapi.module.Module; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.roots.ProjectFileIndex; |
| import com.intellij.openapi.roots.ProjectRootManager; |
| import com.intellij.openapi.util.io.FileUtil; |
| import com.intellij.openapi.vfs.LocalFileSystem; |
| import com.intellij.openapi.vfs.VfsUtilCore; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import org.jetbrains.android.facet.AndroidFacetConfiguration; |
| import org.jetbrains.android.facet.AndroidRootUtil; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| import org.jetbrains.idea.maven.model.MavenArtifact; |
| import org.jetbrains.idea.maven.model.MavenResource; |
| import org.jetbrains.idea.maven.project.MavenProject; |
| import org.jetbrains.idea.maven.project.MavenProjectsManager; |
| import org.jetbrains.idea.maven.utils.MavenArtifactUtil; |
| import org.jetbrains.idea.maven.utils.MavenUtil; |
| |
| import java.io.File; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| import java.util.regex.Pattern; |
| |
| /** |
| * @author Eugene.Kudelevsky |
| */ |
| public class AndroidMavenProviderImpl implements AndroidMavenProvider { |
| |
| public static void setPathsToDefault(MavenProject mavenProject, Module module, AndroidFacetConfiguration configuration) { |
| String moduleDirPath = AndroidRootUtil.getModuleDirPath(module); |
| String genSources = FileUtil.toSystemIndependentName(mavenProject.getGeneratedSourcesDirectory(false)); |
| |
| if (moduleDirPath != null) { |
| final String genRelativePath = FileUtil.getRelativePath(moduleDirPath, genSources, '/'); |
| |
| if (genRelativePath != null) { |
| configuration.getState().GEN_FOLDER_RELATIVE_PATH_APT = '/' + genRelativePath + "/r"; |
| configuration.getState().GEN_FOLDER_RELATIVE_PATH_AIDL = '/' + genRelativePath + "/aidl"; |
| } |
| } |
| } |
| |
| public static void configureAaptCompilation(MavenProject mavenProject, |
| Module module, |
| AndroidFacetConfiguration configuration, |
| boolean hasApkSources) { |
| String moduleDirPath = AndroidRootUtil.getModuleDirPath(module); |
| String genSources = FileUtil.toSystemIndependentName(mavenProject.getGeneratedSourcesDirectory(false)); |
| |
| if (moduleDirPath != null) { |
| final String genRelativePath = FileUtil.getRelativePath(moduleDirPath, genSources, '/'); |
| |
| if (genRelativePath != null) { |
| configuration.getState().USE_CUSTOM_APK_RESOURCE_FOLDER = hasApkSources; |
| configuration.getState().CUSTOM_APK_RESOURCE_FOLDER = '/' + genRelativePath + "/combined-resources/" + SdkConstants.FD_RES; |
| } |
| } |
| |
| configuration.getState().RUN_PROCESS_RESOURCES_MAVEN_TASK = hasApkSources; |
| } |
| |
| static boolean processResources(@NotNull Module module, |
| @NotNull MavenProject mavenProject, |
| ResourceProcessor processor) { |
| for (MavenResource resource : mavenProject.getResources()) { |
| if (resource.isFiltered()) { |
| VirtualFile resDir = LocalFileSystem.getInstance().findFileByPath(resource.getDirectory()); |
| if (resDir == null) continue; |
| |
| List<Pattern> includes = collectPatterns(resource.getIncludes(), "**/*"); |
| List<Pattern> excludes = collectPatterns(resource.getExcludes(), null); |
| final String resourceTargetPath = resource.getTargetPath(); |
| if (resourceTargetPath != null) { |
| String targetPath = FileUtil.toSystemIndependentName(resourceTargetPath); |
| |
| if (processResources(module.getProject(), resDir, resDir, includes, excludes, targetPath, processor)) { |
| return true; |
| } |
| } |
| } |
| } |
| return false; |
| } |
| |
| private static List<Pattern> collectPatterns(@Nullable List<String> values, @Nullable String defaultValue) { |
| List<Pattern> result = new ArrayList<Pattern>(); |
| if (values == null || values.isEmpty()) { |
| if (defaultValue == null) return Collections.emptyList(); |
| return MavenUtil.collectPattern(defaultValue, result); |
| } |
| for (String each : values) { |
| MavenUtil.collectPattern(each, result); |
| } |
| return result; |
| } |
| |
| static boolean processResources(Project project, |
| VirtualFile sourceRoot, |
| VirtualFile file, |
| List<Pattern> includes, |
| List<Pattern> excludes, |
| String resOutputDir, |
| ResourceProcessor processor) { |
| final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); |
| if (!fileIndex.isExcluded(file)) { |
| String relPath = VfsUtilCore.getRelativePath(file, sourceRoot, '/'); |
| if (relPath != null && MavenUtil.isIncluded(relPath, includes, excludes)) { |
| if (processor.process(file, resOutputDir + "/" + relPath)) { |
| return true; |
| } |
| } |
| } |
| if (file.isDirectory()) { |
| for (VirtualFile child : file.getChildren()) { |
| if (processResources(project, sourceRoot, child, includes, excludes, resOutputDir, processor)) { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| |
| @Override |
| public boolean isMavenizedModule(@NotNull Module module) { |
| MavenProjectsManager mavenProjectsManager = MavenProjectsManager.getInstance(module.getProject()); |
| return mavenProjectsManager != null ? mavenProjectsManager.isMavenizedModule(module) : null; |
| } |
| |
| @Override |
| @NotNull |
| public List<File> getMavenDependencyArtifactFiles(@NotNull Module module) { |
| MavenProject mavenProject = MavenProjectsManager.getInstance(module.getProject()).findProject(module); |
| List<File> result = new ArrayList<File>(); |
| if (mavenProject != null) { |
| for (MavenArtifact depArtifact : mavenProject.getDependencies()) { |
| if (AndroidMavenUtil.APKSOURCES_DEPENDENCY_TYPE.equals(depArtifact.getType())) { |
| result.add(MavenArtifactUtil.getArtifactFile(mavenProject.getLocalRepository(), depArtifact.getMavenId())); |
| } |
| } |
| } |
| return result; |
| } |
| |
| @Nullable |
| @Override |
| public String getBuildDirectory(@NotNull Module module) { |
| MavenProject mavenProject = MavenProjectsManager.getInstance(module.getProject()).findProject(module); |
| if (mavenProject != null) { |
| return mavenProject.getBuildDirectory(); |
| } |
| return null; |
| } |
| |
| @Override |
| public void setPathsToDefault(@NotNull Module module, AndroidFacetConfiguration facetConfiguration) { |
| MavenProject mavenProject = MavenProjectsManager.getInstance(module.getProject()).findProject(module); |
| if (mavenProject != null) { |
| setPathsToDefault(mavenProject, module, facetConfiguration); |
| if (hasApkSourcesDependency(mavenProject)) { |
| configureAaptCompilation(mavenProject, module, facetConfiguration, true); |
| } |
| } |
| } |
| |
| public static boolean hasApkSourcesDependency(MavenProject mavenProject) { |
| for (MavenArtifact artifact : mavenProject.getDependencies()) { |
| if (AndroidMavenUtil.APKSOURCES_DEPENDENCY_TYPE.equals(artifact.getType())) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| interface ResourceProcessor { |
| boolean process(@NotNull VirtualFile resource, @NotNull String outputPath); |
| } |
| } |