cleanup yellow code, add toString for easier debugging, javadoc
[idea/community.git] / platform / lang-impl / src / com / intellij / execution / configuration / EnvironmentVariablesComponent.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /*
18  * User: anna
19  * Date: 14-May-2007
20  */
21 package com.intellij.execution.configuration;
22
23 import com.intellij.execution.ExecutionBundle;
24 import com.intellij.openapi.ui.LabeledComponent;
25 import com.intellij.openapi.ui.TextFieldWithBrowseButton;
26 import com.intellij.openapi.util.Comparing;
27 import com.intellij.ui.UserActivityProviderComponent;
28 import org.jdom.Element;
29 import org.jetbrains.annotations.NonNls;
30 import org.jetbrains.annotations.NotNull;
31
32 import javax.swing.event.ChangeListener;
33 import java.util.Map;
34
35 public class EnvironmentVariablesComponent extends LabeledComponent<TextFieldWithBrowseButton> implements UserActivityProviderComponent {
36   @NonNls private static final String ENVS = "envs";
37   @NonNls public static final String ENV = "env";
38   @NonNls public static final String NAME = "name";
39   @NonNls public static final String VALUE = "value";
40   @NonNls private static final String OPTION = "option";
41   @NonNls private static final String ENV_VARIABLES = "ENV_VARIABLES";
42
43   private final EnvironmentVariablesTextFieldWithBrowseButton myEnvVars;
44
45   public EnvironmentVariablesComponent() {
46     super();
47     myEnvVars = new EnvironmentVariablesTextFieldWithBrowseButton();
48     setComponent(myEnvVars);
49     setText(ExecutionBundle.message("environment.variables.component.title"));
50   }
51
52   public void setEnvs(@NotNull Map<String, String> envs) {
53     myEnvVars.setEnvs(envs);
54   }
55
56   @NotNull
57   public Map<String, String> getEnvs() {
58     return myEnvVars.getEnvs();
59   }
60
61   public boolean isPassParentEnvs() {
62     return myEnvVars.isPassParentEnvs();
63   }
64
65   public void setPassParentEnvs(final boolean passParentEnvs) {
66     myEnvVars.setPassParentEnvs(passParentEnvs);
67   }
68
69   @NotNull
70   public EnvironmentVariablesData getEnvData() {
71     return myEnvVars.getData();
72   }
73
74   public void setEnvData(@NotNull EnvironmentVariablesData envData) {
75     myEnvVars.setData(envData);
76   }
77
78   /**
79    * Consider using {@link EnvironmentVariablesData#readExternal(Element)} instead for simplicity and better performance.
80    */
81   public static void readExternal(Element element, Map<String, String> envs) {
82     final Element envsElement = element.getChild(ENVS);
83     if (envsElement != null) {
84       for (Object o : envsElement.getChildren(ENV)) {
85         Element envElement = (Element)o;
86         final String envName = envElement.getAttributeValue(NAME);
87         final String envValue = envElement.getAttributeValue(VALUE);
88         if (envName != null && envValue != null) {
89           envs.put(envName, envValue);
90         }
91       }
92     } else { //compatibility with prev version
93       for (Object o : element.getChildren(OPTION)) {
94         if (Comparing.strEqual(((Element)o).getAttributeValue(NAME), ENV_VARIABLES)) {
95           splitVars(envs, ((Element)o).getAttributeValue(VALUE));
96           break;
97         }
98       }
99     }
100   }
101
102   private static void splitVars(final Map<String, String> envs, final String val) {
103     if (val != null) {
104       final String[] envVars = val.split(";");
105       for (String envVar : envVars) {
106         final int idx = envVar.indexOf('=');
107         if (idx > -1) {
108           envs.put(envVar.substring(0, idx), idx < envVar.length() - 1 ? envVar.substring(idx + 1) : "");
109         }
110       }
111     }
112   }
113
114   /**
115    * Consider using {@link EnvironmentVariablesData#writeExternal(Element)} instead for simplicity and better performance.
116    */
117   public static void writeExternal(@NotNull Element element, @NotNull Map<String, String> envs) {
118     final Element envsElement = new Element(ENVS);
119     for (String envName : envs.keySet()) {
120       final Element envElement = new Element(ENV);
121       envElement.setAttribute(NAME, envName);
122       envElement.setAttribute(VALUE, envs.get(envName));
123       envsElement.addContent(envElement);
124     }
125     element.addContent(envsElement);
126   }
127
128   @Override
129   public void addChangeListener(final ChangeListener changeListener) {
130     myEnvVars.addChangeListener(changeListener);
131   }
132
133   @Override
134   public void removeChangeListener(final ChangeListener changeListener) {
135     myEnvVars.removeChangeListener(changeListener);
136   }
137 }