1 // ******************************************************************************
2 //
3 // Title: Force Field X.
4 // Description: Force Field X - Software for Molecular Biophysics.
5 // Copyright: Copyright (c) Michael J. Schnieders 2001-2024.
6 //
7 // This file is part of Force Field X.
8 //
9 // Force Field X is free software; you can redistribute it and/or modify it
10 // under the terms of the GNU General Public License version 3 as published by
11 // the Free Software Foundation.
12 //
13 // Force Field X is distributed in the hope that it will be useful, but WITHOUT
14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
16 // details.
17 //
18 // You should have received a copy of the GNU General Public License along with
19 // Force Field X; if not, write to the Free Software Foundation, Inc., 59 Temple
20 // Place, Suite 330, Boston, MA 02111-1307 USA
21 //
22 // Linking this library statically or dynamically with other modules is making a
23 // combined work based on this library. Thus, the terms and conditions of the
24 // GNU General Public License cover the whole combination.
25 //
26 // As a special exception, the copyright holders of this library give you
27 // permission to link this library with independent modules to produce an
28 // executable, regardless of the license terms of these independent modules, and
29 // to copy and distribute the resulting executable under terms of your choice,
30 // provided that you also meet, for each linked independent module, the terms
31 // and conditions of the license of that module. An independent module is a
32 // module which is not derived from or based on this library. If you modify this
33 // library, you may extend this exception to your version of the library, but
34 // you are not obligated to do so. If you do not wish to do so, delete this
35 // exception statement from your version.
36 //
37 // ******************************************************************************
38 package ffx.utilities;
39
40 import org.apache.commons.configuration2.CompositeConfiguration;
41 import java.util.LinkedHashMap;
42 import java.util.Map;
43
44 /**
45 * This represents the context of an FFX MolecularAssembly.
46 * <p>
47 * CompositeConfiguration is extended by adding the API used by the Groovy Binding class.
48 * <p>
49 * The Binding API represents the variable bindings of a script which can be altered from outside the
50 * script object or created and passed into it.
51 * <p>
52 * The Binding API is not supposed to be used in a multithreaded context.
53 *
54 * @author Michael J. Schnieders
55 */
56 public class FFXContext extends CompositeConfiguration {
57
58 private Map<String, Object> variables;
59
60 /**
61 * <p>Constructor for FFXContext.</p>
62 */
63 public FFXContext() {
64 super();
65 }
66
67 /**
68 * <p>Constructor for FFXContext.</p>
69 *
70 * @param variables a {@link java.util.Map} object
71 */
72 public FFXContext(Map<String, Object> variables) {
73 this();
74 this.variables = variables;
75 }
76
77 /**
78 * A helper constructor used in main(String[]) method calls
79 *
80 * @param args are the command line arguments from a main()
81 */
82 public FFXContext(String[] args) {
83 this();
84 variables = new LinkedHashMap<>();
85 variables.put("args", args);
86 }
87
88 /**
89 * <p>getVariable.</p>
90 *
91 * @param name the name of the variable to lookup
92 * @return the variable value
93 * @throws java.lang.Exception if any.
94 */
95 public Object getVariable(String name) throws Exception {
96 if (variables == null) {
97 throw new Exception(name);
98 }
99
100 Object result = variables.get(name);
101
102 if (result == null && !variables.containsKey(name)) {
103 throw new Exception(name);
104 }
105
106 return result;
107 }
108
109 /**
110 * Sets the value of the given variable
111 *
112 * @param name the name of the variable to set
113 * @param value the new value for the given variable
114 */
115 public void setVariable(String name, Object value) {
116 if (variables == null) {
117 variables = new LinkedHashMap<>();
118 }
119 variables.put(name, value);
120 }
121
122 /**
123 * Remove the variable with the specified name.
124 *
125 * @param name the name of the variable to remove
126 */
127 public void removeVariable(String name) {
128 if (null == variables) {
129 return;
130 }
131
132 variables.remove(name);
133 }
134
135 /**
136 * Simple check for whether the context contains a particular variable or not.
137 *
138 * @param name the name of the variable to check for
139 * @return a boolean
140 */
141 public boolean hasVariable(String name) {
142 return variables != null && variables.containsKey(name);
143 }
144
145 /**
146 * Get the Map of all variables. This returns a reference and not a copy.
147 *
148 * @return a Map of the variables.
149 */
150 public Map<String, Object> getVariables() {
151 if (variables == null) {
152 variables = new LinkedHashMap<>();
153 }
154 return variables;
155 }
156
157 /**
158 * Set the Map of all variables. The reference is kept without making a copy.
159 *
160 * @param variables a Map of the variables.
161 */
162 public void setVariables(Map<String, Object> variables) {
163 this.variables = variables;
164 }
165
166 }
167