1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * ident "%Z%%M% %I% %E% SMI" 24 * 25 * Copyright (c) 2001 by Sun Microsystems, Inc. 26 * All rights reserved. 27 */ 28 package com.sun.dhcpmgr.client; 29 30 import java.awt.*; 31 import java.awt.event.*; 32 import java.util.*; 33 import java.text.MessageFormat; 34 35 import javax.swing.*; 36 37 import com.sun.dhcpmgr.data.DhcpDatastore; 38 import com.sun.dhcpmgr.server.*; 39 import com.sun.dhcpmgr.ui.*; 40 41 /** 42 * This class defines a Wizard that configures a data store. 43 */ 44 public abstract class DSWizard extends Wizard implements DSModuleListener { 45 46 /** 47 * The collection of valid DSConf objects. 48 */ 49 protected DSConfList dsconfList = null; 50 51 /** 52 * The selected DSConf 53 */ 54 private DSConf dsconf = null; 55 56 /** 57 * This class is a holder for the set of DSConf objects. 58 */ 59 protected class DSConfList extends ArrayList { 60 61 /** 62 * Initializes the set of supported DSConfList. 63 * @param server handle to a service manager server 64 */ 65 public void init(DhcpServiceMgr server) { 66 67 DhcpDatastore [] dsArray = null; 68 69 try { 70 dsArray = server.getDataStores(); 71 } catch (Throwable e) { 72 // ignore for now 73 } 74 75 for (int i = 0; 76 dsArray != null && i < dsArray.length; i++) { 77 String dsResource = dsArray[i].getResource(); 78 try { 79 80 String className = server.getDataStoreClassname(dsResource); 81 DSConf dsconf = new DSConf(dsArray[i], className); 82 dsconfList.add(dsconf); 83 } catch (Throwable e) { 84 MessageFormat form = new MessageFormat( 85 ResourceStrings.getString("ds_wiz_init_error")); 86 Object args = new Object[] { 87 dsResource, 88 e.getMessage() 89 }; 90 JOptionPane.showMessageDialog(DSWizard.this, 91 form.format(args), 92 ResourceStrings.getString("server_error_title"), 93 JOptionPane.ERROR_MESSAGE); 94 } 95 } 96 } // init 97 98 /** 99 * Finds and returns a DSConf by resource. 100 * @param resource the resource of the DSConf. 101 * @return the DSConf if found or null if not found. 102 */ 103 public DSConf findDsconf(String resource) { 104 105 DSConf entry = null; 106 for (int i = 0; i < size(); i++) { 107 DSConf dsconf = (DSConf) get(i); 108 if (dsconf.getDS().getResource().equals(resource)) { 109 entry = dsconf; 110 break; 111 } 112 } 113 114 return entry; 115 116 } // findDSConf 117 118 } // DSConfList 119 120 /** 121 * This class is a simple holder for a data store 122 * and the module used to manage the data store. 123 */ 124 protected class DSConf { 125 126 /** 127 * DHCP datastore information. 128 */ 129 private DhcpDatastore ds = null; 130 131 /** 132 * The module used to manage the data store. 133 */ 134 private DSModule dsm = null; 135 136 /** 137 * Constructs a DSConf from a name and a classname. 138 * @param ds DHCP data store. 139 * @param className of the DSModule classname. 140 */ 141 public DSConf(DhcpDatastore ds, String className) 142 throws Exception { 143 144 Class dataStoreClass = Class.forName(className); 145 146 dsm = (DSModule)dataStoreClass.newInstance(); 147 this.ds = ds; 148 } // constructor 149 150 /** 151 * Returns the DhcpDatastore for this DSConf 152 * @return the DhcpDatastore for this DSConf 153 */ 154 public DhcpDatastore getDS() { 155 return ds; 156 } // getDS 157 158 /** 159 * Returns the module used to manage the data store. 160 * @return the module used to manage the data store. 161 */ 162 public DSModule getModule() { 163 return dsm; 164 } // getModule 165 166 167 /** 168 * Sets the location from the module into the DhcpDatastore. 169 */ 170 public void setLocation() { 171 ds.setLocation(dsm.getPath()); 172 } // setLocation 173 174 /** 175 * Sets the location from the module into the DhcpDatastore. 176 */ 177 public void setConfig() { 178 ds.setConfig(dsm.getAdditionalInfo()); 179 } // setConfig 180 181 } // DSConf 182 183 /** 184 * This class maps a radio button and a DSConf. 185 */ 186 private class DSConfButton extends JRadioButton { 187 188 /** 189 * The data store to link to the radio button. 190 */ 191 DSConf dsconf = null; 192 193 /** 194 * Constructs a DSConfButton from a DSConf and determines 195 * whether the button should be selected using the boolean argument. 196 * @param dsconf the data store to map to the radio button. 197 * @param selected select the radio button? 198 */ 199 public DSConfButton(DSConf dsconf, boolean selected) { 200 super(dsconf.getModule().getDescription(), selected); 201 setEnabled(dsconf.getDS().isEnabled()); 202 this.dsconf = dsconf; 203 } // constructor 204 205 /** 206 * Returns the DSConf mapped to the radio button. 207 * @return the DSConf mapped to the radio button. 208 */ 209 public DSConf getDsconf() { 210 return dsconf; 211 } // getDsconf 212 213 } // DSConfButton 214 215 216 /** 217 * This class is the wizard step that presents the choice of 218 * data stores to the user for selection. 219 */ 220 protected class DatastoreStep implements WizardStep { 221 222 /** 223 * The component provided to the wizard. 224 */ 225 private Box stepBox; 226 227 /** 228 * The group of DSConfButton objects. 229 */ 230 private ButtonGroup buttonGroup; 231 232 /** 233 * The basic constructor for the wizard step. 234 * @param wizardText the main explanatory text for the wizard. 235 * @param stepText the explanatory text for the step. 236 */ 237 public DatastoreStep(String wizardText, String stepText) { 238 239 super(); 240 241 stepBox = Box.createVerticalBox(); 242 243 // Explanatory wizard intro text 244 // 245 JComponent c = Wizard.createTextArea(wizardText, 2, 45); 246 c.setAlignmentX(Component.LEFT_ALIGNMENT); 247 stepBox.add(c); 248 stepBox.add(Box.createVerticalStrut(5)); 249 250 // Explanatory step text 251 // 252 c = Wizard.createTextArea(stepText, 3, 45); 253 c.setAlignmentX(Component.LEFT_ALIGNMENT); 254 stepBox.add(c); 255 stepBox.add(Box.createVerticalStrut(5)); 256 257 // Create button listener, that will set the selected 258 // data store when the button is selected. 259 // 260 ActionListener buttonListener = new ActionListener() { 261 public void actionPerformed(ActionEvent e) { 262 DSConfButton button = (DSConfButton)e.getSource(); 263 if (button.isSelected()) { 264 setDsconf(button.getDsconf()); 265 } 266 } 267 }; 268 269 // Create panel that will contain the buttons. 270 // 271 JPanel boxPanel = new JPanel(); 272 boxPanel.setAlignmentX(Component.LEFT_ALIGNMENT); 273 boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS)); 274 boxPanel.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 20)); 275 276 // List data store choices. 277 // 278 buttonGroup = new ButtonGroup(); 279 for (int i = 0; i < dsconfList.size(); ++i) { 280 DSConf dsconf = (DSConf)dsconfList.get(i); 281 DSConfButton radioButton = 282 new DSConfButton(dsconf, false); 283 radioButton.setAlignmentX(Component.LEFT_ALIGNMENT); 284 radioButton.addActionListener(buttonListener); 285 buttonGroup.add(radioButton); 286 boxPanel.add(radioButton); 287 } 288 289 // Add the panel to the stepBox component. 290 // 291 stepBox.add(boxPanel); 292 stepBox.add(Box.createVerticalStrut(20)); 293 stepBox.add(Box.createVerticalGlue()); 294 295 } // constructor 296 297 public String getDescription() { 298 return ResourceStrings.getString("ds_wiz_datastore_desc"); 299 } // getDescription 300 301 public Component getComponent() { 302 return stepBox; 303 } // getComponent 304 305 public void setActive(int direction) { 306 if (getDsconf() != null) { 307 setForwardEnabled(true); 308 } else { 309 setForwardEnabled(false); 310 } 311 } // setActive 312 313 public boolean setInactive(int direction) { 314 return true; 315 } // setInactive 316 317 318 public void enableButton(String resource, boolean enable) { 319 320 DSConfButton button = null; 321 Enumeration en = buttonGroup.getElements(); 322 while (en.hasMoreElements()) { 323 DSConfButton enButton = (DSConfButton)en.nextElement(); 324 DSConf DSConf = enButton.getDsconf(); 325 if (dsconf.getDS().getResource().equals(resource)) { 326 button = enButton; 327 break; 328 } 329 } 330 331 if (button != null) { 332 button.setEnabled(enable); 333 } 334 335 } // enableButton 336 337 } // DatastoreStep 338 339 /** 340 * This class is the wizard step that presents the data store module 341 * bean to the user for data store configuration. 342 */ 343 protected class DatastoreModuleStep implements WizardStep { 344 345 /** 346 * The component provided to the wizard. 347 */ 348 private Box stepBox; 349 350 /** 351 * Basic constructor. The component for the step will actually be 352 * built in the setActive method, as this step is dependant upon 353 * the data store selection made by the user in the DatastoreStep 354 * wizard step. 355 */ 356 public DatastoreModuleStep() { 357 stepBox = Box.createVerticalBox(); 358 stepBox.add(Box.createVerticalGlue()); 359 } // constructor 360 361 public String getDescription() { 362 return ResourceStrings.getString("ds_wiz_datastore_parm_desc"); 363 } // getDescription 364 365 public Component getComponent() { 366 return stepBox; 367 } // getComponent 368 369 public void setActive(int direction) { 370 if (direction > 0) { 371 stepBox.removeAll(); 372 Component component = 373 getDsconf().getModule().getComponent(); 374 if (component != null) { 375 stepBox.add(component); 376 stepBox.add(Box.createVerticalGlue()); 377 validate(); 378 } 379 } 380 381 if (getDsconf().getModule().getForwardEnabled()) { 382 setForwardEnabled(true); 383 } else { 384 setForwardEnabled(false); 385 } 386 } // setActive 387 388 public boolean setInactive(int direction) { 389 return true; 390 } // setInactive 391 392 } // DatastoreModuleStep 393 394 /** 395 * Simple constructor. 396 * @param owner frame for wizard. 397 * @param title title of the wizard. 398 */ 399 public DSWizard(Frame owner, String title) { 400 super(owner, title); 401 } // constructor 402 403 /** 404 * Sets dsconf. 405 * @param dsconf the data store config value. 406 */ 407 public void setDsconf(DSConf dsconf) { 408 if (this.dsconf != null) { 409 this.dsconf.getModule().removeDSMListener(this); 410 } 411 setForwardEnabled(true); 412 this.dsconf = dsconf; 413 this.dsconf.getModule().addDSMListener(this); 414 } // setDsconf 415 416 /** 417 * Returns the dsconf. 418 * @return the dsconf. 419 */ 420 public DSConf getDsconf() { 421 return dsconf; 422 } // getDsconf 423 424 /** 425 * Invoked when the DSModule has changed its state. 426 * @param e the event. 427 */ 428 public void stateChanged(DSModuleEvent e) { 429 if (e.getState() == DSModuleEvent.DATA_VALID) { 430 setForwardEnabled(true); 431 } else { 432 setForwardEnabled(false); 433 } 434 } // stateChanged 435 436 } // DSWizard