package com.intellij.flex.model.bc.impl; import com.intellij.flex.model.bc.JpsFlexBuildConfiguration; import com.intellij.flex.model.bc.JpsFlexBuildConfigurationManager; import com.intellij.flex.model.bc.JpsFlexModuleOrProjectCompilerOptions; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Condition; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xmlb.annotations.AbstractCollection; import com.intellij.util.xmlb.annotations.Attribute; import com.intellij.util.xmlb.annotations.Property; import com.intellij.util.xmlb.annotations.Tag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElementCollection; import org.jetbrains.jps.model.ex.JpsCompositeElementBase; import java.util.ArrayList; import java.util.List; public class JpsFlexBuildConfigurationManagerImpl extends JpsCompositeElementBase<JpsFlexBuildConfigurationManagerImpl> implements JpsFlexBuildConfigurationManager { private static final Logger LOG = Logger.getInstance(JpsFlexBuildConfigurationManagerImpl.class.getName()); private JpsFlexBuildConfiguration myActiveConfiguration; public JpsFlexBuildConfigurationManagerImpl() { myContainer.setChild(JpsFlexBuildConfigurationImpl.COLLECTION_ROLE); myContainer.setChild(JpsFlexCompilerOptionsRole.INSTANCE); } private JpsFlexBuildConfigurationManagerImpl(final JpsFlexBuildConfigurationManagerImpl original) { super(original); } @NotNull public JpsFlexBuildConfigurationManagerImpl createCopy() { return new JpsFlexBuildConfigurationManagerImpl(this); } public void applyChanges(@NotNull final JpsFlexBuildConfigurationManagerImpl modified) { super.applyChanges(modified); //.. } // ------------------------------ public List<JpsFlexBuildConfiguration> getBuildConfigurations() { return myContainer.getChild(JpsFlexBuildConfigurationImpl.COLLECTION_ROLE).getElements(); } //public JpsFlexBuildConfiguration addBuildConfiguration(String name) { // return myContainer.getChild(JpsFlexBuildConfigurationImpl.COLLECTION_ROLE).addChild(new JpsFlexBuildConfigurationImpl(name)); //} public JpsFlexBuildConfiguration getActiveConfiguration() { return myActiveConfiguration; } @Override @Nullable public JpsFlexBuildConfiguration findConfigurationByName(final String name) { for (JpsFlexBuildConfiguration configuration : getBuildConfigurations()) { if (configuration.getName().equals(name)) { return configuration; } } return null; } public JpsFlexModuleOrProjectCompilerOptions getModuleLevelCompilerOptions() { return myContainer.getChild(JpsFlexCompilerOptionsRole.INSTANCE); } public JpsFlexBuildConfiguration createCopy(@NotNull final JpsFlexBuildConfiguration bc) { final JpsFlexBuildConfigurationImpl copy = ((JpsFlexBuildConfigurationImpl)bc).createCopy(); copy.setParent(((JpsFlexBuildConfigurationImpl)bc).getParent()); return copy; } public JpsFlexBuildConfiguration createTemporaryCopyForCompilation(@NotNull final JpsFlexBuildConfiguration bc) { final JpsFlexBuildConfigurationImpl copy = ((JpsFlexBuildConfigurationImpl)bc).createCopy(); copy.setParent(((JpsFlexBuildConfigurationImpl)bc).getParent()); copy.setTempBCForCompilation(true); return copy; } private void updateActiveConfiguration(@Nullable final String activeBCName) { final List<JpsFlexBuildConfiguration> bcs = getBuildConfigurations(); if (bcs.isEmpty()) { LOG.error("No Flex build configurations"); myActiveConfiguration = null; } else { myActiveConfiguration = activeBCName != null ? ContainerUtil.find(bcs, bc -> bc.getName().equals(activeBCName)) : null; if (myActiveConfiguration == null) { myActiveConfiguration = bcs.get(0); } } } // ------------------------------ public State getState() { final State state = new State(); for (JpsFlexBuildConfiguration configuration : getBuildConfigurations()) { state.CONFIGURATIONS.add(((JpsFlexBuildConfigurationImpl)configuration).getState()); } state.ACTIVE_BC_NAME = myActiveConfiguration != null ? myActiveConfiguration.getName() : null; state.MODULE_LEVEL_COMPILER_OPTIONS = ((JpsFlexCompilerOptionsImpl)getModuleLevelCompilerOptions()).getState(); return state; } public void loadState(final State state) { //if (myModule == null) { // throw new IllegalStateException("Cannot load state of a dummy config manager instance"); //} final JpsElementCollection<JpsFlexBuildConfiguration> bcs = myContainer.getChild(JpsFlexBuildConfigurationImpl.COLLECTION_ROLE); LOG.assertTrue(bcs.getElements().size() == 0); for (JpsFlexBCState configurationState : state.CONFIGURATIONS) { JpsFlexBuildConfigurationImpl bc = new JpsFlexBuildConfigurationImpl(configurationState.NAME); bc.loadState(configurationState); bcs.addChild(bc); } if (bcs.getElements().isEmpty()) { LOG.warn("Flex build configurations not loaded from *.iml."); bcs.addChild(new JpsFlexBuildConfigurationImpl(JpsFlexBuildConfiguration.UNNAMED)); } updateActiveConfiguration(state.ACTIVE_BC_NAME); ((JpsFlexCompilerOptionsImpl)getModuleLevelCompilerOptions()).loadState(state.MODULE_LEVEL_COMPILER_OPTIONS); } public static class State { @Tag("configurations") @AbstractCollection(surroundWithTag = false, elementTag = "configuration") public List<JpsFlexBCState> CONFIGURATIONS = new ArrayList<>(); @Property(surroundWithTag = false) public JpsFlexCompilerOptionsImpl.State MODULE_LEVEL_COMPILER_OPTIONS = new JpsFlexCompilerOptionsImpl.State(); @Attribute("active") public String ACTIVE_BC_NAME; } }