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 1998-2002 by Sun Microsystems, Inc. All rights reserved.
26 * Use is subject to license terms.
27 */
28 package com.sun.dhcpmgr.client;
29
30 import javax.swing.*;
31 import javax.swing.table.*;
32 import java.util.*;
33 import java.awt.*;
34 import java.awt.event.*;
35 import java.net.*;
36
37 import com.sun.dhcpmgr.data.*;
38 import com.sun.dhcpmgr.ui.*;
39 import com.sun.dhcpmgr.server.DhcpNetMgr;
40
41 /**
42 * This dialog allows the user to modify multiple addresses
43 */
44 public class ModifyAddressesDialog extends MultipleOperationDialog {
45 private DhcpClientRecord [] recs;
46 private String table;
47 private JLabel numberLabel;
48 private JComboBox server;
49 private JTextField comment;
50 private JComboBox macro;
51 private JRadioButton bootpCurrent, bootpAll, bootpNone;
52 private JRadioButton unusableCurrent, unusableAll, unusableNone;
53 private JRadioButton leaseCurrent, leaseDynamic, leasePermanent;
54 private static final String keepString =
55 ResourceStrings.getString("modify_multiple_keep");
56
57 class ServerListModel extends AbstractListModel implements ComboBoxModel {
58 private String [] servers;
59 private Object currentValue;
60
61 public ServerListModel() {
62 servers = new String[2];
63 servers[0] = keepString;
64 servers[1] = DataManager.get().getShortServerName();
65 }
66
67 public int getSize() {
68 return servers.length;
69 }
70
71 public Object getElementAt(int index) {
72 return servers[index];
73 }
74
75 public void setSelectedItem(Object anItem) {
76 currentValue = anItem;
77 fireContentsChanged(this, -1, -1);
78 }
79
80 public Object getSelectedItem() {
81 return currentValue;
82 }
83 }
84
85 class MacroListModel extends AbstractListModel implements ComboBoxModel {
86 private String [] macros;
87 private Object currentValue;
88
89 public MacroListModel() {
90 Macro [] macs = new Macro[0];
91 try {
92 macs = DataManager.get().getMacros(false);
93 macros = new String[macs.length + 1];
94 } catch (Throwable e) {
95 macros = new String[1];
96 }
97 macros[0] = keepString;
98 for (int i = 0; i < macs.length; ++i) {
99 macros[i+1] = macs[i].getKey();
100 }
101 }
102
103 public int getSize() {
104 return macros.length;
105 }
106
107 public Object getElementAt(int index) {
108 return macros[index];
109 }
110
111 public void setSelectedItem(Object anItem) {
112 currentValue = anItem;
113 fireContentsChanged(this, -1, -1);
114 }
115
116 public Object getSelectedItem() {
117 return currentValue;
118 }
119 }
120
121 public ModifyAddressesDialog(Frame f, DhcpClientRecord [] clients,
122 String table) {
123 // Create dialog with reset button
124 super(f, true);
125
126 this.table = table;
127 recs = clients;
128 numberLabel.setText(String.valueOf(recs.length));
129 }
130
131 public String getTitle() {
132 return ResourceStrings.getString("modify_multiple_addresses");
133 }
134
135 protected JPanel getMainPanel() {
136 JPanel mainPanel = new JPanel();
137 mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
138 GridBagLayout bag = new GridBagLayout();
139 mainPanel.setLayout(bag);
140 GridBagConstraints con = new GridBagConstraints();
141 con.gridx = con.gridy = 0;
142 con.weightx = con.weighty = 1.0;
143 con.insets = new Insets(5, 5, 5, 5);
144 con.gridwidth = con.gridheight = 1;
145
146 // Number of addresses
147 Mnemonic mnAddrSel =
148 new Mnemonic(ResourceStrings.getString("modify_multiple_number"));
149 JLabel label = new JLabel(mnAddrSel.getString());
150 label.setLabelFor(mainPanel);
151 label.setDisplayedMnemonic(mnAddrSel.getMnemonic());
152 label.setToolTipText(mnAddrSel.getString());
153
154 con.anchor = GridBagConstraints.EAST;
155 bag.setConstraints(label, con);
156 mainPanel.add(label);
157
158 numberLabel = new JLabel("100");
159 numberLabel.setForeground(Color.black);
160 ++con.gridx;
161 con.anchor = GridBagConstraints.WEST;
162 bag.setConstraints(numberLabel, con);
163 mainPanel.add(numberLabel);
164
165 // Server
166 Mnemonic mnManServ =
167 new Mnemonic(ResourceStrings.getString("modify_multiple_server"));
168 label = new JLabel(mnManServ.getString());
169 label.setDisplayedMnemonic(mnManServ.getMnemonic());
170 label.setToolTipText(mnManServ.getString());
171 con.anchor = GridBagConstraints.EAST;
172 con.gridx = 0;
173 con.gridy += 2;
174 bag.setConstraints(label, con);
175 mainPanel.add(label);
176
177 server = new JComboBox(new ServerListModel());
178 label.setLabelFor(server);
179 server.setEditable(true);
180 con.anchor = GridBagConstraints.WEST;
181 ++con.gridx;
182 bag.setConstraints(server, con);
183 mainPanel.add(server);
184
185 // Comment
186 Mnemonic mnComm =
187 new Mnemonic(ResourceStrings.getString("modify_multiple_comment"));
188 label = new JLabel(mnComm.getString());
189 label.setDisplayedMnemonic(mnComm.getMnemonic());
190 label.setToolTipText(mnComm.getString());
191 con.anchor = GridBagConstraints.EAST;
192 con.gridx = 0;
193 ++con.gridy;
194 bag.setConstraints(label, con);
195 mainPanel.add(label);
196
197 comment = new JTextField(20);
198 label.setLabelFor(comment);
199 con.anchor = GridBagConstraints.WEST;
200 ++con.gridx;
201 bag.setConstraints(comment, con);
202 mainPanel.add(comment);
203
204 // Macro
205 Mnemonic mnMac =
206 new Mnemonic(ResourceStrings.getString("modify_multiple_macro"));
207 label = new JLabel(mnMac.getString());
208 label.setDisplayedMnemonic(mnMac.getMnemonic());
209 label.setToolTipText(mnMac.getString());
210 con.anchor = GridBagConstraints.EAST;
211 con.gridx = 0;
212 ++con.gridy;
213 bag.setConstraints(label, con);
214 mainPanel.add(label);
215
216 macro = new JComboBox(new MacroListModel());
217 label.setLabelFor(macro);
218 con.anchor = GridBagConstraints.WEST;
219 ++con.gridx;
220 bag.setConstraints(macro, con);
221 mainPanel.add(macro);
222
223 // BootP
224 Mnemonic mnBootP =
225 new Mnemonic(ResourceStrings.getString("modify_multiple_bootp"));
226 label = new JLabel(mnBootP.getString());
227 label.setDisplayedMnemonic(mnBootP.getMnemonic());
228 label.setToolTipText(mnBootP.getString());
229 con.anchor = GridBagConstraints.EAST;
230 con.gridx = 0;
231 con.gridy += 2;
232 bag.setConstraints(label, con);
233 mainPanel.add(label);
234
235 ButtonGroup bootpGroup = new ButtonGroup();
236 bootpCurrent = new JRadioButton(keepString);
237 label.setLabelFor(bootpCurrent);
238 bootpCurrent.setToolTipText(keepString);
239 bootpGroup.add(bootpCurrent);
240 con.anchor = GridBagConstraints.WEST;
241 ++con.gridx;
242 bag.setConstraints(bootpCurrent, con);
243 mainPanel.add(bootpCurrent);
244
245 bootpAll = new JRadioButton(
246 ResourceStrings.getString("modify_multiple_bootp_all"));
247 bootpAll.setToolTipText(
248 ResourceStrings.getString("modify_multiple_bootp_all"));
249 bootpGroup.add(bootpAll);
250 ++con.gridy;
251 bag.setConstraints(bootpAll, con);
252 mainPanel.add(bootpAll);
253
254 bootpNone = new JRadioButton(
255 ResourceStrings.getString("modify_multiple_bootp_none"));
256 bootpNone.setToolTipText(
257 ResourceStrings.getString("modify_multiple_bootp_none"));
258 bootpGroup.add(bootpNone);
259 ++con.gridy;
260 bag.setConstraints(bootpNone, con);
261 mainPanel.add(bootpNone);
262
263 // Unusable
264 Mnemonic mnUnusable =
265 new Mnemonic(ResourceStrings.getString("modify_multiple_unusable"));
266 label = new JLabel(mnUnusable.getString());
267 label.setDisplayedMnemonic(mnUnusable.getMnemonic());
268 label.setToolTipText(mnUnusable.getString());
269 con.anchor = GridBagConstraints.EAST;
270 con.gridx = 0;
271 con.gridy += 2;
272 bag.setConstraints(label, con);
273 mainPanel.add(label);
274
275 ButtonGroup unusableGroup = new ButtonGroup();
276 unusableCurrent = new JRadioButton(keepString);
277 label.setLabelFor(unusableCurrent);
278 unusableCurrent.setToolTipText(keepString);
279 unusableGroup.add(unusableCurrent);
280 con.anchor = GridBagConstraints.WEST;
281 ++con.gridx;
282 bag.setConstraints(unusableCurrent, con);
283 mainPanel.add(unusableCurrent);
284
285 unusableAll = new JRadioButton(
286 ResourceStrings.getString("modify_multiple_unusable_all"));
287 unusableAll.setToolTipText(
288 ResourceStrings.getString("modify_multiple_unusable_all"));
289 unusableGroup.add(unusableAll);
290 ++con.gridy;
291 bag.setConstraints(unusableAll, con);
292 mainPanel.add(unusableAll);
293
294 unusableNone = new JRadioButton(
295 ResourceStrings.getString("modify_multiple_unusable_none"));
296 unusableNone.setToolTipText(
297 ResourceStrings.getString("modify_multiple_unusable_none"));
298 unusableGroup.add(unusableNone);
299 ++con.gridy;
300 bag.setConstraints(unusableNone, con);
301 mainPanel.add(unusableNone);
302
303 // Lease
304 Mnemonic mnLease =
305 new Mnemonic(ResourceStrings.getString("modify_multiple_lease"));
306 label = new JLabel(mnLease.getString());
307 label.setDisplayedMnemonic(mnLease.getMnemonic());
308 label.setToolTipText(mnLease.getString());
309 con.anchor = GridBagConstraints.EAST;
310 con.gridx = 0;
311 con.gridy += 2;
312 bag.setConstraints(label, con);
313 mainPanel.add(label);
314
315 ButtonGroup leaseGroup = new ButtonGroup();
316 leaseCurrent = new JRadioButton(keepString);
317 label.setLabelFor(leaseCurrent);
318 leaseCurrent.setToolTipText(keepString);
319 leaseGroup.add(leaseCurrent);
320 con.anchor = GridBagConstraints.WEST;
321 ++con.gridx;
322 bag.setConstraints(leaseCurrent, con);
323 mainPanel.add(leaseCurrent);
324
325 leaseDynamic = new JRadioButton(
326 ResourceStrings.getString("modify_multiple_dynamic"));
327 leaseDynamic.setToolTipText(
328 ResourceStrings.getString("modify_multiple_dynamic"));
329 leaseGroup.add(leaseDynamic);
330 ++con.gridy;
331 bag.setConstraints(leaseDynamic, con);
332 mainPanel.add(leaseDynamic);
333
334 leasePermanent = new JRadioButton(
335 ResourceStrings.getString("modify_multiple_permanent"));
336 leasePermanent.setToolTipText(
337 ResourceStrings.getString("modify_multiple_permanent"));
338 leaseGroup.add(leasePermanent);
339 ++con.gridy;
340 bag.setConstraints(leasePermanent, con);
341 mainPanel.add(leasePermanent);
342
343 buttonPanel.setOkEnabled(true);
344 doReset();
345
346 return mainPanel;
347 }
348
349 protected void doReset() {
350 server.setSelectedIndex(0);
351 comment.setText(keepString);
352 macro.setSelectedIndex(0);
353 bootpCurrent.setSelected(true);
354 unusableCurrent.setSelected(true);
355 leaseCurrent.setSelected(true);
356 }
357
358 protected String getProgressMessage() {
359 return ResourceStrings.getString("modify_multiple_progress");
360 }
361
362 protected int getProgressLength() {
363 return recs.length;
364 }
365
366 protected String getErrorHeading() {
367 return ResourceStrings.getString("address_column");
368 }
369
370 protected Class getErrorClass() {
371 return IPAddress.class;
372 }
373
374 protected Thread getOperationThread() {
375 return new Thread() {
376 public void run() {
377 DhcpNetMgr netMgr = DataManager.get().getDhcpNetMgr();
378 for (int i = 0; i < recs.length; ++i) {
379 DhcpClientRecord client = (DhcpClientRecord)recs[i].clone();
380 try {
381 String s = (String)server.getSelectedItem();
382 if (!s.equals(keepString)) {
383 // Change server if necessary
384 client.setServerIP(new IPAddress(s));
385 }
386 s = comment.getText();
387 if (!s.equals(keepString)) {
388 client.setComment(s);
389 }
390 if (macro.getSelectedIndex() != 0) {
391 client.setMacro((String)macro.getSelectedItem());
392 }
393 if (bootpAll.isSelected()) {
394 client.setBootp(true);
395 } else if (bootpNone.isSelected()) {
396 client.setBootp(false);
397 }
398 if (unusableAll.isSelected()) {
399 client.setUnusable(true);
400 } else if (unusableNone.isSelected()) {
401 client.setUnusable(false);
402 }
403 if (leaseDynamic.isSelected()) {
404 client.setPermanent(false);
405 } else if (leasePermanent.isSelected()) {
406 client.setPermanent(true);
407 }
408 netMgr.modifyClient(recs[i], client, table);
409 updateProgress(i+1, client.getClientIPAddress());
410 } catch (InterruptedException e) {
411 closeDialog();
412 return;
413 } catch (Throwable e) {
414 addError(recs[i].getClientIP(), e.getMessage());
415 }
416 }
417 // Errors occurred, display them
418 if (errorsOccurred()) {
419 displayErrors(
420 ResourceStrings.getString("modify_multiple_error"));
421 }
422 closeDialog();
423 }
424 };
425 }
426
427 protected String getHelpKey() {
428 return "modify_multiple_addresses";
429 }
430
431 protected void fireActionPerformed() {
432 fireActionPerformed(this, DialogActions.OK);
433 }
434 }