blob: 08004598e45be0de0347e2a8cb38798746019c2c [file] [log] [blame]
/*
* 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;
}
}