| /* |
| * 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); |
| } |
| } |
| } |
| } |