/* * Copyright 2000-2012 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.jps.android.model.impl; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xmlb.XmlSerializerUtil; import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.android.util.AndroidNativeLibData; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.android.model.JpsAndroidModuleExtension; import org.jetbrains.jps.android.model.JpsAndroidSdkProperties; import org.jetbrains.jps.android.model.JpsAndroidSdkType; import org.jetbrains.jps.model.JpsSimpleElement; import org.jetbrains.jps.model.ex.JpsElementBase; import org.jetbrains.jps.model.ex.JpsElementChildRoleBase; import org.jetbrains.jps.model.library.sdk.JpsSdk; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.serialization.JpsModelSerializationDataService; import org.jetbrains.jps.util.JpsPathUtil; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author nik */ public class JpsAndroidModuleExtensionImpl extends JpsElementBase<JpsAndroidModuleExtensionImpl> implements JpsAndroidModuleExtension { public static final JpsElementChildRoleBase<JpsAndroidModuleExtension> KIND = JpsElementChildRoleBase.create("android extension"); private final JpsAndroidModuleProperties myProperties; public JpsAndroidModuleExtensionImpl(JpsAndroidModuleProperties properties) { myProperties = properties; } @Override public JpsModule getModule() { return (JpsModule)getParent(); } @NotNull @Override public JpsAndroidModuleExtensionImpl createCopy() { return new JpsAndroidModuleExtensionImpl(XmlSerializerUtil.createCopy(myProperties)); } @Override public void applyChanges(@NotNull JpsAndroidModuleExtensionImpl modified) { XmlSerializerUtil.copyBean(modified.myProperties, myProperties); fireElementChanged(); } @Override public String getCustomDebugKeyStorePath() { return JpsPathUtil.urlToPath(myProperties.CUSTOM_DEBUG_KEYSTORE_PATH); } @Override public List<AndroidNativeLibData> getAdditionalNativeLibs() { final List<AndroidNativeLibData> libDatas = new ArrayList<AndroidNativeLibData>(); for (JpsAndroidModuleProperties.AndroidNativeLibDataEntry nativeLib : myProperties.myNativeLibs) { if (nativeLib.myArchitecture != null && nativeLib.myUrl != null && nativeLib.myTargetFileName != null) { libDatas.add(new AndroidNativeLibData(nativeLib.myArchitecture, JpsPathUtil.urlToPath(nativeLib.myUrl), nativeLib.myTargetFileName)); } } return libDatas; } @Override public boolean isUseCustomManifestPackage() { return myProperties.USE_CUSTOM_MANIFEST_PACKAGE; } @Override public String getCustomManifestPackage() { return myProperties.CUSTOM_MANIFEST_PACKAGE; } @Override public String getAdditionalPackagingCommandLineParameters() { return myProperties.ADDITIONAL_PACKAGING_COMMAND_LINE_PARAMETERS; } @Override public boolean isManifestMergingEnabled() { return myProperties.ENABLE_MANIFEST_MERGING; } @Override public boolean isPreDexingEnabled() { return myProperties.ENABLE_PRE_DEXING; } @Override public boolean isCopyCustomGeneratedSources() { return myProperties.COMPILE_CUSTOM_GENERATED_SOURCES; } @Override public File getResourceDir() { File resDir = findFileByRelativeModulePath(myProperties.RES_FOLDER_RELATIVE_PATH, false); return resDir != null ? canonizeFilePath(resDir) : null; } @NotNull @Override public List<File> getResourceOverlayDirs() { final List<String> paths = myProperties.RES_OVERLAY_FOLDERS; if (paths == null || paths.isEmpty()) { return Collections.emptyList(); } return ContainerUtil.mapNotNull(paths, new Function<String, File>() { @Override public File fun(String s) { final File resDir = findFileByRelativeModulePath(s, false); return resDir != null ? canonizeFilePath(resDir) : null; } }); } @Override public File getResourceDirForCompilation() { File resDir = findFileByRelativeModulePath(myProperties.CUSTOM_APK_RESOURCE_FOLDER, false); return resDir != null ? canonizeFilePath(resDir) : null; } @Override public File getManifestFile() { File manifestFile = findFileByRelativeModulePath(myProperties.MANIFEST_FILE_RELATIVE_PATH, false); return manifestFile != null ? canonizeFilePath(manifestFile) : null; } @Override public File getManifestFileForCompilation() { File manifestFile = findFileByRelativeModulePath(myProperties.CUSTOM_COMPILER_MANIFEST, false); return manifestFile != null ? canonizeFilePath(manifestFile) : null; } @Nullable @Override public List<File> getProguardConfigFiles(@NotNull JpsModule module) throws IOException { final JpsSdk<JpsSimpleElement<JpsAndroidSdkProperties>> sdk = module.getSdk(JpsAndroidSdkType.INSTANCE); final String sdkHomePath = sdk != null ? FileUtil.toSystemIndependentName(sdk.getHomePath()) : null; final List<String> urls = myProperties.myProGuardCfgFiles; if (urls == null) { return null; } if (urls.isEmpty()) { return Collections.emptyList(); } final List<File> result = new ArrayList<File>(); for (String url : urls) { if (sdkHomePath != null) { url = StringUtil.replace(url, AndroidCommonUtils.SDK_HOME_MACRO, sdkHomePath); } result.add(JpsPathUtil.urlToFile(url)); } return result; } @Override public File getAssetsDir() { File manifestFile = findFileByRelativeModulePath(myProperties.ASSETS_FOLDER_RELATIVE_PATH, false); return manifestFile != null ? canonizeFilePath(manifestFile) : null; } public File getAaptGenDir() throws IOException { File aaptGenDir = findFileByRelativeModulePath(myProperties.GEN_FOLDER_RELATIVE_PATH_APT, true); return aaptGenDir != null ? canonizeFilePath(aaptGenDir) : null; } public File getAidlGenDir() throws IOException { File aidlGenDir = findFileByRelativeModulePath(myProperties.GEN_FOLDER_RELATIVE_PATH_AIDL, true); return aidlGenDir != null ? canonizeFilePath(aidlGenDir) : null; } public JpsAndroidModuleProperties getProperties() { return myProperties; } @Override public File getNativeLibsDir() { File nativeLibsFolder = findFileByRelativeModulePath(myProperties.LIBS_FOLDER_RELATIVE_PATH, true); return nativeLibsFolder != null ? canonizeFilePath(nativeLibsFolder) : null; } @Override public File getProguardLogsDir() { File proguardLogsDir = findFileByRelativeModulePath(myProperties.PROGUARD_LOGS_FOLDER_RELATIVE_PATH, false); return proguardLogsDir != null ? canonizeFilePath(proguardLogsDir) : null; } private static File canonizeFilePath(@NotNull File file) { return new File(FileUtil.toCanonicalPath(file.getPath())); } @Nullable private File findFileByRelativeModulePath(String relativePath, boolean checkExistence) { if (relativePath == null || relativePath.length() == 0) { return null; } final JpsModule module = getModule(); File moduleBaseDir = JpsModelSerializationDataService.getBaseDirectory(module); if (moduleBaseDir != null) { String absPath = FileUtil.toSystemDependentName(moduleBaseDir.getAbsolutePath() + relativePath); File f = new File(absPath); if (!checkExistence || f.exists()) { return f; } } return null; } @Override public boolean isGradleProject() { return !myProperties.ALLOW_USER_CONFIGURATION; } @Override public boolean isLibrary() { return myProperties.LIBRARY_PROJECT; } @Override public boolean useCustomResFolderForCompilation() { return myProperties.USE_CUSTOM_APK_RESOURCE_FOLDER; } @Override public boolean useCustomManifestForCompilation() { return myProperties.USE_CUSTOM_COMPILER_MANIFEST; } @Override public boolean isPackTestCode() { return myProperties.PACK_TEST_CODE; } @Override public boolean isIncludeAssetsFromLibraries() { return myProperties.myIncludeAssetsFromLibraries; } @Override public boolean isRunProcessResourcesMavenTask() { return myProperties.RUN_PROCESS_RESOURCES_MAVEN_TASK; } @Override public boolean isRunProguard() { return myProperties.RUN_PROGUARD; } @Override public String getApkRelativePath() { return myProperties.APK_PATH; } }