/* * Copyright 2000-2014 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 com.intellij.execution.impl; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.configurations.UnknownRunConfiguration; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.containers.HashSet; import com.intellij.util.text.UniqueNameGenerator; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; /** * User: anna * Date: 28-Mar-2006 */ @State( name = "ProjectRunConfigurationManager", storages = { @Storage(file = StoragePathMacros.PROJECT_FILE), @Storage(file = StoragePathMacros.PROJECT_CONFIG_DIR + "/runConfigurations/", scheme = StorageScheme.DIRECTORY_BASED, stateSplitter = ProjectRunConfigurationManager.RunConfigurationStateSplitter.class) } ) public class ProjectRunConfigurationManager implements ProjectComponent, PersistentStateComponent { private static final Logger LOG = Logger.getInstance(ProjectRunConfigurationManager.class); private final RunManagerImpl myManager; private List myUnloadedElements = null; public ProjectRunConfigurationManager(final RunManagerImpl manager) { myManager = manager; } @Override public void projectOpened() { } @Override public void projectClosed() { } @Override @NotNull @NonNls public String getComponentName() { return "ProjectRunConfigurationManager"; } @Override public void initComponent() { } @Override public void disposeComponent() { } @Override public Element getState() { try { final Element e = new Element("state"); writeExternal(e); return e; } catch (WriteExternalException e1) { LOG.error(e1); return null; } } @Override public void loadState(Element state) { try { readExternal(state); } catch (InvalidDataException e) { LOG.error(e); } } public void readExternal(Element element) throws InvalidDataException { myUnloadedElements = null; final Set existing = new HashSet(); final List children = element.getChildren(); for (final Object child : children) { final RunnerAndConfigurationSettings configuration = myManager.loadConfiguration((Element)child, true); if (configuration == null && Comparing.strEqual(element.getName(), RunManagerImpl.CONFIGURATION)) { if (myUnloadedElements == null) myUnloadedElements = new ArrayList(2); myUnloadedElements.add(element); } if (configuration != null) { existing.add(configuration.getUniqueID()); } } myManager.removeNotExistingSharedConfigurations(existing); if (myManager.getSelectedConfiguration() == null) { final List allConfigurations = myManager.getAllConfigurationsList(); for (final RunConfiguration configuration : allConfigurations) { final RunnerAndConfigurationSettings settings = myManager.getSettings(allConfigurations.get(0)); if (!(configuration instanceof UnknownRunConfiguration)) { myManager.setSelectedConfiguration(settings); break; } } } // IDEA-60004: configs may never be sorted before write, so call it manually after shared configs read myManager.setOrdered(false); myManager.getSortedConfigurations(); } public void writeExternal(Element element) throws WriteExternalException { final Collection configurations = myManager.getStableConfigurations(); for (RunnerAndConfigurationSettings configuration : configurations) { if (myManager.isConfigurationShared(configuration)){ myManager.addConfigurationElement(element, configuration); } } if (myUnloadedElements != null) { for (Element unloadedElement : myUnloadedElements) { element.addContent(unloadedElement.clone()); } } } public static class RunConfigurationStateSplitter implements StateSplitter { @Override public List> splitState(Element e) { final UniqueNameGenerator generator = new UniqueNameGenerator(); List> result = new ArrayList>(); final List list = e.getChildren(); for (final Object o : list) { Element library = (Element)o; final String name = generator.generateUniqueName(FileUtil.sanitizeFileName(library.getAttributeValue(RunManagerImpl.NAME_ATTR))) + ".xml"; result.add(Pair.create(library, name)); } return result; } @Override public void mergeStatesInto(Element target, Element[] elements) { for (Element e : elements) { target.addContent(e); } } } }