package net.jangaroo.ide.idea.jps;
import com.intellij.facet.FacetManagerImpl;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.util.xmlb.XmlSerializer;
import net.jangaroo.ide.idea.jps.exml.ExmlcConfigurationBean;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsElementChildRole;
import org.jetbrains.jps.model.ex.JpsElementChildRoleBase;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.JDomSerializationUtil;
import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension;
import org.jetbrains.jps.model.serialization.artifact.JpsPackagingElementSerializer;
import org.jetbrains.jps.model.serialization.facet.JpsFacetSerializer;
import org.jetbrains.jps.model.serialization.library.JpsSdkPropertiesSerializer;
import java.util.Collections;
import java.util.List;
/**
* JPS extension to extract Jangaroo Facet configuration into the corresponding JpsModule.
*/
public class JangarooModelSerializerExtension extends JpsModelSerializerExtension {
public static final String JANGAROO_FACET_ID = "jangaroo";
public static final String EXML_FACET_ID = "exml";
private static final JpsElementChildRole<JoocConfigurationBean> JOOC_CONFIG = JpsElementChildRoleBase.create("Jangaroo Compiler Configuration");
private static final JpsElementChildRole<ExmlcConfigurationBean> EXMLC_CONFIG = JpsElementChildRoleBase.create("EXML Compiler Configuration");
@Nullable
public static JoocConfigurationBean getJoocSettings(@NotNull JpsModule module) {
return module.getContainer().getChild(JOOC_CONFIG);
}
@Nullable
public static ExmlcConfigurationBean getExmlcSettings(@NotNull JpsModule module) {
return module.getContainer().getChild(EXMLC_CONFIG);
}
@NotNull
@Override
public List<? extends JpsPackagingElementSerializer<?>> getPackagingElementSerializers() {
return Collections.singletonList(new JpsResourcesModuleOutputPackagingElementSerializer());
}
@NotNull
@Override
public List<? extends JpsSdkPropertiesSerializer<?>> getSdkPropertiesSerializers() {
return Collections.singletonList(new JpsJangarooSdkPropertiesSerializer());
}
@Override
public void loadModuleOptions(@NotNull JpsModule jpsModule, @NotNull Element rootTag) {
// find configuration element of Jangaroo Facet:
Element jangarooElement = findFacetConfiguration(rootTag, JANGAROO_FACET_ID);
if (jangarooElement != null) {
JoocConfigurationBean configuration = XmlSerializer.deserialize(jangarooElement, JoocConfigurationBean.class);
if (configuration == null) {
configuration = new JoocConfigurationBean();
}
jpsModule.getContainer().setChild(JOOC_CONFIG, configuration);
}
// find configuration element of EXML Facet:
Element exmlElement = findFacetConfiguration(rootTag, EXML_FACET_ID);
if (exmlElement != null) {
ExmlcConfigurationBean configuration = XmlSerializer.deserialize(exmlElement, ExmlcConfigurationBean.class);
if (configuration == null) {
configuration = new ExmlcConfigurationBean();
}
jpsModule.getContainer().setChild(EXMLC_CONFIG, configuration);
}
}
private Element findFacetConfiguration(Element rootTag, String facetId) {
Element facetManagerElement = JDomSerializationUtil.findComponent(rootTag, FacetManagerImpl.COMPONENT_NAME);
for (Element facet : JDOMUtil.getChildren(facetManagerElement, JpsFacetSerializer.FACET_TAG)) {
if (facetId.equals(facet.getAttributeValue(JpsFacetSerializer.TYPE_ATTRIBUTE))) {
return facet.getChild(JpsFacetSerializer.CONFIGURATION_TAG);
}
}
return null;
}
}