blob: f0fff5255908eaa4b200413a8eaace64b907c992 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* 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 com.android.tools.idea.jps.model.impl;
import com.android.tools.idea.gradle.facet.AndroidGradleFacet;
import com.android.tools.idea.jps.AndroidGradleJps;
import com.android.tools.idea.jps.model.JpsAndroidGradleModuleExtension;
import com.google.common.collect.ImmutableList;
import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.android.model.JpsAndroidSdkProperties;
import org.jetbrains.jps.android.model.JpsAndroidSdkType;
import org.jetbrains.jps.model.JpsElement;
import org.jetbrains.jps.model.JpsElementFactory;
import org.jetbrains.jps.model.JpsSimpleElement;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension;
import org.jetbrains.jps.model.serialization.facet.JpsFacetConfigurationSerializer;
import org.jetbrains.jps.model.serialization.library.JpsSdkPropertiesSerializer;
import java.util.List;
@SuppressWarnings("ConstantConditions")
public class JpsAndroidGradleModelSerializerExtension extends JpsModelSerializerExtension {
private static final List<? extends JpsFacetConfigurationSerializer<JpsAndroidGradleModuleExtension>> FACET_PROPERTY_LOADERS =
ImmutableList.of(new JpsAndroidGradleFacetConfigurationSerializer());
private static final JpsAndroidSdkPropertiesSerializer SDK_PROPERTY_LOADER = new JpsAndroidSdkPropertiesSerializer();
private static final String EXTERNAL_SYSTEM_ID_ATTRIBUTE = "external.system.id";
private static final String GRADLE_EXTERNAL_SYSTEM_ID = "GRADLE";
@NotNull
@Override
public List<? extends JpsFacetConfigurationSerializer<?>> getFacetConfigurationSerializers() {
return FACET_PROPERTY_LOADERS;
}
@Override
public void loadModuleOptions(@NotNull JpsModule module, @NotNull Element rootElement) {
final String externalSystemId = rootElement.getAttributeValue(EXTERNAL_SYSTEM_ID_ATTRIBUTE);
if (GRADLE_EXTERNAL_SYSTEM_ID.equals(externalSystemId)) {
AndroidGradleJps.getOrCreateGradleSystemExtension(module);
}
}
@Override
public void saveModuleOptions(@NotNull JpsModule module, @NotNull Element rootElement) {
if (AndroidGradleJps.getGradleSystemExtension(module) != null) {
rootElement.setAttribute(EXTERNAL_SYSTEM_ID_ATTRIBUTE, GRADLE_EXTERNAL_SYSTEM_ID);
}
}
@NotNull
@Override
public List<? extends JpsSdkPropertiesSerializer<?>> getSdkPropertiesSerializers() {
return ImmutableList.of(SDK_PROPERTY_LOADER);
}
private static class JpsAndroidGradleFacetConfigurationSerializer
extends JpsFacetConfigurationSerializer<JpsAndroidGradleModuleExtension> {
JpsAndroidGradleFacetConfigurationSerializer() {
super(JpsAndroidGradleModuleExtensionImpl.KIND, AndroidGradleFacet.ID, AndroidGradleFacet.NAME);
}
@Override
protected JpsAndroidGradleModuleExtension loadExtension(@NotNull Element facetConfigurationElement,
String name,
JpsElement parent,
JpsModule module) {
JpsAndroidGradleModuleProperties properties =
XmlSerializer.deserialize(facetConfigurationElement, JpsAndroidGradleModuleProperties.class);
return new JpsAndroidGradleModuleExtensionImpl(properties);
}
@Override
protected void saveExtension(JpsAndroidGradleModuleExtension extension, Element facetConfigurationTag, JpsModule module) {
XmlSerializer.serializeInto(extension.getProperties(), facetConfigurationTag);
}
}
private static class JpsAndroidSdkPropertiesSerializer extends JpsSdkPropertiesSerializer<JpsSimpleElement<JpsAndroidSdkProperties>> {
private static final String JDK_ATTR = "jdk";
private static final String SDK_ATTR = "sdk";
JpsAndroidSdkPropertiesSerializer() {
super("Android SDK", JpsAndroidSdkType.INSTANCE);
}
@NotNull
@Override
public JpsSimpleElement<JpsAndroidSdkProperties> loadProperties(@Nullable Element propertiesElement) {
String buildTarget = null;
String jdkName = null;
if (propertiesElement != null) {
buildTarget = propertiesElement.getAttributeValue(SDK_ATTR);
jdkName = propertiesElement.getAttributeValue(JDK_ATTR);
}
return JpsElementFactory.getInstance().createSimpleElement(new JpsAndroidSdkProperties(buildTarget, jdkName));
}
@Override
public void saveProperties(@NotNull JpsSimpleElement<JpsAndroidSdkProperties> properties, @NotNull Element element) {
String jdkName = properties.getData().getJdkName();
if (jdkName != null) {
element.setAttribute(JDK_ATTR, jdkName);
}
String buildTarget = properties.getData().getBuildTargetHashString();
if (buildTarget != null) {
element.setAttribute(SDK_ATTR, buildTarget);
}
}
}
}