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