1 //
2 // Copyright (c) ZeroC, Inc. All rights reserved.
3 //
4 
5 package com.zeroc.IceGridGUI.Application;
6 
7 import java.awt.event.ActionEvent;
8 
9 import javax.swing.AbstractAction;
10 import javax.swing.Action;
11 import javax.swing.JCheckBox;
12 import javax.swing.JComboBox;
13 import javax.swing.JComponent;
14 import javax.swing.JScrollPane;
15 import javax.swing.JTextField;
16 
17 import com.jgoodies.forms.builder.DefaultFormBuilder;
18 import com.jgoodies.forms.layout.CellConstraints;
19 
20 import com.zeroc.IceGrid.*;
21 import com.zeroc.IceGridGUI.*;
22 
23 @SuppressWarnings("unchecked")
24 class ServerSubEditor extends CommunicatorSubEditor
25 {
ServerSubEditor(Editor mainEditor)26     ServerSubEditor(Editor mainEditor)
27     {
28         super(mainEditor);
29 
30         _id.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
31         _id.setToolTipText("Must be unique within this IceGrid deployment");
32 
33         _exe.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
34         _exe.setToolTipText("<html>Path to this server's executable, e.g.:<br>"
35                             + "icebox<br>"
36                             + "java<br>"
37                             + "myHelloServer<br>"
38                             + "C:\\testbed\\hello\\server</html>");
39 
40         _iceVersion.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
41         _iceVersion.setToolTipText("<html>The Ice version used by this server;<br>"
42                                    + "blank means 'same version as the IceGrid registry'.</html>");
43 
44         _pwd.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
45         _pwd.setToolTipText(
46             "<html>If not set, the server will start in "
47             + "<i>node data dir</i>/servers/<i>server-id</i>;<br>"
48             + "relative directories are relative to the current directory"
49             + " of the icegridnode process.</html>");
50 
51         _options.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
52         _options.setToolTipText(
53             "<html>Command-line arguments for this server.<br>"
54             + "Use whitespace as separator; use double-quotes around arguments containing whitespaces</html>");
55 
56         _user.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
57         _user.setToolTipText(
58             "<html>Run the server using this user account.<br>"
59             + "This feature is only available on Unix/Linux, when the IceGrid node runs as root.</html>");
60 
61         _envs = new SimpleMapField(mainEditor, true, "Name", "Value");
62 
63         _activation = new JComboBox(new String[]{ALWAYS, MANUAL, ON_DEMAND, SESSION});
64         _activation.setToolTipText("<html>always: IceGrid starts and keeps the server up all the time<br>"
65                                    + "manual: you start the server yourself<br>"
66                                    + "on-demand: IceGrid starts the server when a client needs it<br>"
67                                    + "session: IceGrid starts and shuts down the server for each session</html>");
68 
69         JTextField activationTextField = (JTextField)_activation.getEditor().getEditorComponent();
70         activationTextField.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
71 
72         _activationTimeout.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
73         _activationTimeout.setToolTipText("<html>Number of seconds; if not set or set to 0, "
74                                           + "the IceGrid Node<br> uses the value of its "
75                                           + "IceGrid.Node.WaitTime property</html>");
76         _deactivationTimeout.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
77         _deactivationTimeout.setToolTipText("<html>Number of seconds; if not set or set to 0, "
78                                              + "the IceGrid Node<br> uses the value of its "
79                                              + "IceGrid.Node.WaitTime property</html>");
80 
81         Action allocatable = new AbstractAction("Allocatable")
82             {
83                 @Override
84                 public void actionPerformed(ActionEvent e)
85                 {
86                     _mainEditor.updated();
87                 }
88             };
89         allocatable.putValue(Action.SHORT_DESCRIPTION,
90                              "<html>Check this box to ensure that the well-known objects<br>"
91                              + "of this server can only be allocated by one session at a time.</html>");
92         _allocatable = new JCheckBox(allocatable);
93 
94         Action appDistrib = new AbstractAction("Depends on the application distribution")
95             {
96                 @Override
97                 public void actionPerformed(ActionEvent e)
98                 {
99                     _mainEditor.updated();
100                 }
101             };
102         appDistrib.putValue(Action.SHORT_DESCRIPTION,
103                             "<html>Check this box if this server needs to be restarted<br>"
104                             + "each time the distribution for your application is refreshed.</html>");
105 
106         _applicationDistrib = new JCheckBox(appDistrib);
107 
108         _distrib = new JComboBox(new Object[]{NO_DISTRIB, DEFAULT_DISTRIB});
109         _distrib.setToolTipText("The proxy to the IcePatch2 server holding your files");
110 
111         JTextField distribTextField = (JTextField)_distrib.getEditor().getEditorComponent();
112         distribTextField.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
113 
114         _distribDirs.getDocument().addDocumentListener(_mainEditor.getUpdateListener());
115         _distribDirs.setToolTipText(
116             "<html>Include only these directories when patching.<br>"
117             + "Use whitespace as separator; use double-quotes around directories containing whitespaces</html>");
118     }
119 
getServerDescriptor()120     ServerDescriptor getServerDescriptor()
121     {
122         return (ServerDescriptor)_mainEditor.getSubDescriptor();
123     }
124 
125     @Override
appendProperties(DefaultFormBuilder builder)126     void appendProperties(DefaultFormBuilder builder)
127     {
128         builder.append("Server ID");
129         builder.append(_id, 3);
130         builder.nextLine();
131 
132         //
133         // Add Communicator fields
134         //
135         super.appendProperties(builder);
136 
137         builder.appendSeparator("Activation");
138         builder.append("Path to Executable");
139         builder.append(_exe, 3);
140         builder.nextLine();
141         builder.append("Ice Version");
142         builder.append(_iceVersion, 3);
143         builder.nextLine();
144         builder.append("Working Directory");
145         builder.append(_pwd, 3);
146         builder.nextLine();
147         builder.append("Command Arguments");
148         builder.append(_options, 3);
149         builder.nextLine();
150         builder.append("Run as");
151         builder.append(_user, 3);
152         builder.nextLine();
153         builder.append("Environment Variables");
154         builder.nextLine();
155         builder.append("");
156         builder.nextLine();
157         builder.append("");
158         builder.nextLine();
159         builder.append("");
160         builder.nextRow(-6);
161         CellConstraints cc = new CellConstraints();
162         JScrollPane scrollPane = new JScrollPane(_envs);
163         builder.add(scrollPane, cc.xywh(builder.getColumn(), builder.getRow(), 3, 7));
164         builder.nextRow(6);
165         builder.nextLine();
166 
167         builder.append("Activation Mode");
168         builder.append(_activation, 3);
169         builder.nextLine();
170         builder.append("Activation Timeout");
171         builder.append(_activationTimeout, 3);
172         builder.nextLine();
173         builder.append("Deactivation Timeout");
174         builder.append(_deactivationTimeout, 3);
175         builder.nextLine();
176         builder.append("", _allocatable);
177         builder.nextLine();
178 
179         JComponent c = builder.appendSeparator("Distribution");
180         c.setToolTipText("Files specific to this server");
181 
182         builder.append("", _applicationDistrib);
183         builder.nextLine();
184         builder.append("IcePatch2 Proxy");
185         builder.append(_distrib, 3);
186         builder.nextLine();
187         builder.append("Directories");
188         builder.append(_distribDirs, 3);
189         builder.nextLine();
190     }
191 
writeDescriptor()192     void writeDescriptor()
193     {
194         ServerDescriptor descriptor = getServerDescriptor();
195         descriptor.id = _id.getText().trim();
196         descriptor.exe = _exe.getText().trim();
197         descriptor.iceVersion = _iceVersion.getText().trim();
198         descriptor.pwd = _pwd.getText().trim();
199 
200         descriptor.options = _options.getList();
201         descriptor.user = _user.getText().trim();
202 
203         descriptor.envs = new java.util.LinkedList<>();
204         for(java.util.Map.Entry<String, String> p : _envs.get().entrySet())
205         {
206             descriptor.envs.add(p.getKey() + "=" + p.getValue());
207         }
208 
209         descriptor.activation = _activation.getSelectedItem().toString().trim();
210         descriptor.activationTimeout = _activationTimeout.getText().trim();
211         descriptor.deactivationTimeout = _deactivationTimeout.getText().trim();
212 
213         descriptor.allocatable = _allocatable.isSelected();
214 
215         descriptor.applicationDistrib = _applicationDistrib.isSelected();
216 
217         if(_distrib.getSelectedItem() == NO_DISTRIB)
218         {
219             descriptor.distrib.icepatch = "";
220         }
221         else
222         {
223             descriptor.distrib.icepatch = _distrib.getSelectedItem().toString().trim();
224         }
225         descriptor.distrib.directories = _distribDirs.getList();
226 
227         super.writeDescriptor(descriptor);
228     }
229 
isSimpleUpdate()230     boolean isSimpleUpdate()
231     {
232         return getServerDescriptor().id.equals(_id.getText().trim());
233     }
234 
validate()235     boolean validate()
236     {
237         return _mainEditor.check(new String[]{
238             "Server ID", _id.getText().trim(),
239             "Path to Executable", _exe.getText().trim()});
240     }
241 
show(boolean isEditable)242     void show(boolean isEditable)
243     {
244         ServerDescriptor descriptor = getServerDescriptor();
245         Utils.Resolver detailResolver = _mainEditor.getDetailResolver();
246 
247         isEditable = isEditable && (detailResolver == null);
248 
249         if(detailResolver != null)
250         {
251             _id.setText(detailResolver.find("server"));
252         }
253         else
254         {
255             _id.setText(descriptor.id);
256         }
257         _id.setEditable(isEditable);
258 
259         _exe.setText(Utils.substitute(descriptor.exe, detailResolver));
260         _exe.setEditable(isEditable);
261         _iceVersion.setText(Utils.substitute(descriptor.iceVersion, detailResolver));
262         _iceVersion.setEditable(isEditable);
263 
264         _pwd.setText(Utils.substitute(descriptor.pwd, detailResolver));
265         _pwd.setEditable(isEditable);
266 
267         _options.setList(descriptor.options, detailResolver);
268         _options.setEditable(isEditable);
269 
270         _user.setText(Utils.substitute(descriptor.user, detailResolver));
271         _user.setEditable(isEditable);
272 
273         java.util.Map<String, String> envMap = new java.util.TreeMap<>();
274         for(String p : descriptor.envs)
275         {
276             int equal = p.indexOf('=');
277             if(equal == -1 || equal == p.length() - 1)
278             {
279                 envMap.put(p, "");
280             }
281             else
282             {
283                 envMap.put(p.substring(0, equal), p.substring(equal + 1));
284             }
285         }
286         _envs.set(envMap, detailResolver, isEditable);
287 
288         String activation = Utils.substitute(descriptor.activation, detailResolver);
289 
290         _activation.setEnabled(true);
291         _activation.setEditable(true);
292         if(activation.equals(ALWAYS))
293         {
294             _activation.setSelectedItem(ALWAYS);
295         }
296         else if(activation.equals(MANUAL))
297         {
298             _activation.setSelectedItem(MANUAL);
299         }
300         else if(activation.equals(ON_DEMAND))
301         {
302             _activation.setSelectedItem(ON_DEMAND);
303         }
304         else if(activation.equals(SESSION))
305         {
306             _activation.setSelectedItem(SESSION);
307         }
308         else
309         {
310             _activation.setSelectedItem(activation);
311         }
312         _activation.setEnabled(isEditable);
313         _activation.setEditable(isEditable);
314 
315         _activationTimeout.setText(Utils.substitute(descriptor.activationTimeout, detailResolver));
316         _activationTimeout.setEditable(isEditable);
317 
318         _deactivationTimeout.setText(Utils.substitute(descriptor.deactivationTimeout, detailResolver));
319         _deactivationTimeout.setEditable(isEditable);
320 
321         _allocatable.setSelected(descriptor.allocatable);
322         _allocatable.setEnabled(isEditable);
323 
324         _applicationDistrib.setSelected(descriptor.applicationDistrib);
325         _applicationDistrib.setEnabled(isEditable);
326 
327         _distrib.setEnabled(true);
328         _distrib.setEditable(true);
329         String icepatch = Utils.substitute(descriptor.distrib.icepatch, detailResolver);
330         if(icepatch.equals(""))
331         {
332             _distrib.setSelectedItem(NO_DISTRIB);
333         }
334         else
335         {
336             _distrib.setSelectedItem(icepatch);
337         }
338         _distrib.setEnabled(isEditable);
339         _distrib.setEditable(isEditable);
340 
341         _distribDirs.setList(descriptor.distrib.directories, detailResolver);
342         _distribDirs.setEditable(isEditable);
343 
344         show(descriptor, isEditable);
345     }
346 
347     static private final String ALWAYS = "always";
348     static private final String MANUAL = "manual";
349     static private final String ON_DEMAND = "on-demand";
350     static private final String SESSION = "session";
351 
352     static private final Object NO_DISTRIB = new Object()
353         {
354             @Override
355             public String toString()
356             {
357                 return "None selected";
358             }
359         };
360 
361     static private final String DEFAULT_DISTRIB = "${application}.IcePatch2/server";
362 
363     private JTextField _id = new JTextField(20);
364     private JTextField _exe = new JTextField(20);
365     private JTextField _iceVersion = new JTextField(20);
366     private JTextField _pwd = new JTextField(20);
367     private ListTextField _options = new ListTextField(20);
368     private JTextField _user = new JTextField(20);
369     private SimpleMapField _envs;
370 
371     private JComboBox _activation;
372     private JTextField _activationTimeout = new JTextField(20);
373     private JTextField _deactivationTimeout = new JTextField(20);
374     private JCheckBox _allocatable;
375     private JCheckBox _applicationDistrib;
376     private JComboBox _distrib;
377     private ListTextField _distribDirs = new ListTextField(20);
378 }
379