001/* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt 010 * or http://forgerock.org/license/CDDLv1.0.html. 011 * See the License for the specific language governing permissions 012 * and limitations under the License. 013 * 014 * When distributing Covered Code, include this CDDL HEADER in each 015 * file and include the License file at legal-notices/CDDLv1_0.txt. 016 * If applicable, add the following below this CDDL HEADER, with the 017 * fields enclosed by brackets "[]" replaced with your own identifying 018 * information: 019 * Portions Copyright [yyyy] [name of copyright owner] 020 * 021 * CDDL HEADER END 022 * 023 * 024 * Copyright 2008-2010 Sun Microsystems, Inc. 025 * Portions Copyright 2013-2015 ForgeRock AS. 026 */ 027 028package org.opends.guitools.controlpanel.ui; 029 030import static org.opends.messages.AdminToolMessages.*; 031 032import java.awt.Component; 033import java.awt.GridBagConstraints; 034import java.awt.GridBagLayout; 035import java.awt.datatransfer.Transferable; 036import java.awt.datatransfer.UnsupportedFlavorException; 037import java.awt.dnd.DnDConstants; 038import java.awt.dnd.DropTarget; 039import java.awt.dnd.DropTargetDragEvent; 040import java.awt.dnd.DropTargetDropEvent; 041import java.awt.dnd.DropTargetEvent; 042import java.awt.dnd.DropTargetListener; 043import java.awt.event.ActionEvent; 044import java.awt.event.ActionListener; 045import java.io.IOException; 046import java.util.ArrayList; 047import java.util.LinkedHashSet; 048 049import javax.swing.ButtonGroup; 050import javax.swing.JButton; 051import javax.swing.JLabel; 052import javax.swing.JPanel; 053import javax.swing.JRadioButton; 054import javax.swing.JScrollPane; 055import javax.swing.JTextArea; 056import javax.swing.JTextField; 057import javax.swing.SwingUtilities; 058import javax.swing.event.DocumentEvent; 059import javax.swing.event.DocumentListener; 060 061import org.opends.guitools.controlpanel.browser.BrowserController; 062import org.opends.guitools.controlpanel.ui.nodes.BasicNode; 063import org.opends.guitools.controlpanel.ui.nodes.BrowserNodeInfo; 064import org.opends.guitools.controlpanel.ui.nodes.DndBrowserNodes; 065import org.opends.guitools.controlpanel.util.Utilities; 066import org.forgerock.i18n.LocalizableMessage; 067import org.opends.server.types.DN; 068import org.opends.server.types.LDAPURL; 069import org.opends.server.types.OpenDsException; 070import org.opends.server.util.ServerConstants; 071 072/** 073 * The panel to create a group. 074 * 075 */ 076public class NewGroupPanel extends AbstractNewEntryPanel 077{ 078 private static final long serialVersionUID = -8173120152617813282L; 079 private JLabel lName = Utilities.createPrimaryLabel(); 080 private JLabel lDescription = Utilities.createPrimaryLabel(); 081 private JLabel lMembers = Utilities.createPrimaryLabel(); 082 private JLabel lDn = Utilities.createPrimaryLabel(); 083 084 private JLabel lMemberDNs; 085 private JLabel lLDAPURL; 086 private JLabel lReferenceGroup; 087 088 089 private JLabel[] labels = {lName, lDescription, lMembers, lDn}; 090 091 private JTextField name = Utilities.createLongTextField(); 092 private JTextField description = Utilities.createLongTextField(); 093 private JRadioButton dynamicGroup; 094 private JRadioButton staticGroup; 095 private JRadioButton virtualGroup; 096 097 private JTextArea staticMembers; 098 private JButton addMembers; 099 private JTextField filter = Utilities.createLongTextField(); 100 private JTextField referenceGroup = Utilities.createLongTextField(); 101 private JButton browseReferenceGroup; 102 103 private GenericDialog membersDlg; 104 private LDAPEntrySelectionPanel membersPanel; 105 106 private GenericDialog referenceGroupDlg; 107 private LDAPEntrySelectionPanel referenceGroupPanel; 108 109 private JLabel dn = Utilities.createDefaultLabel(); 110 111 112 /** 113 * An array containing the fields of this panel. 114 */ 115 protected final JTextField[] fields = {name, description, filter, 116 referenceGroup}; 117 118 /** 119 * Default constructor. 120 * 121 */ 122 public NewGroupPanel() 123 { 124 super(); 125 createLayout(); 126 } 127 128 /** {@inheritDoc} */ 129 public void setParent(BasicNode parentNode, BrowserController controller) 130 { 131 super.setParent(parentNode, controller); 132 dn.setText(","+parentNode.getDN()); 133 for (JTextField tf : fields) 134 { 135 tf.setText(""); 136 } 137 staticMembers.setText(""); 138 filter.setText("ldap:///"+parentNode.getDN()+"??sub?(<your filter>)"); 139 } 140 141 /** {@inheritDoc} */ 142 public LocalizableMessage getTitle() 143 { 144 return INFO_CTRL_PANEL_NEW_GROUP_PANEL_TITLE.get(); 145 } 146 147 /** {@inheritDoc} */ 148 public Component getPreferredFocusComponent() 149 { 150 return name; 151 } 152 153 /** {@inheritDoc} */ 154 protected LocalizableMessage getProgressDialogTitle() 155 { 156 return INFO_CTRL_PANEL_NEW_GROUP_PANEL_TITLE.get(); 157 } 158 159 /** {@inheritDoc} */ 160 protected boolean checkSyntaxBackground() 161 { 162 return staticGroup.isSelected(); 163 } 164 165 /** {@inheritDoc} */ 166 protected void checkSyntax(ArrayList<LocalizableMessage> errors) 167 { 168 Runnable runnable = new Runnable() 169 { 170 /** {@inheritDoc} */ 171 public void run() 172 { 173 for (JLabel label : labels) 174 { 175 setPrimaryValid(label); 176 } 177 setSecondaryValid(lMemberDNs); 178 setSecondaryValid(lLDAPURL); 179 setSecondaryValid(lReferenceGroup); 180 } 181 }; 182 if (checkSyntaxBackground()) 183 { 184 SwingUtilities.invokeLater(runnable); 185 } 186 else 187 { 188 runnable.run(); 189 } 190 191 JTextField[] requiredFields = {name}; 192 LocalizableMessage[] msgs = {ERR_CTRL_PANEL_NAME_OF_GROUP_REQUIRED.get()}; 193 for (int i=0; i<requiredFields.length; i++) 194 { 195 String v = requiredFields[i].getText().trim(); 196 if (v.length() == 0) 197 { 198 errors.add(msgs[i]); 199 } 200 } 201 202 if (staticGroup.isSelected()) 203 { 204 String[] members = staticMembers.getText().split("\n"); 205 boolean oneMemberDefined = false; 206 boolean errorFound = false; 207 for (String member : members) 208 { 209 member = member.trim(); 210 if (member.length() > 0) 211 { 212 try 213 { 214 DN.valueOf(member); 215 if (!entryExists(member)) 216 { 217 errorFound = true; 218 errors.add(ERR_CTRL_PANEL_MEMBER_NOT_FOUND.get(member)); 219 } 220 else 221 { 222 oneMemberDefined = true; 223 } 224 } 225 catch (OpenDsException ode) 226 { 227 errorFound = true; 228 errors.add(ERR_CTRL_PANEL_MEMBER_VALUE_NOT_VALID.get(member, ode.getMessageObject())); 229 } 230 } 231 } 232 if (!oneMemberDefined && !errorFound) 233 { 234 errorFound = true; 235 errors.add(ERR_CTRL_PANEL_MEMBER_REQUIRED.get()); 236 } 237 if (errorFound) 238 { 239 SwingUtilities.invokeLater(new Runnable() 240 { 241 public void run() 242 { 243 setSecondaryInvalid(lMemberDNs); 244 setPrimaryInvalid(lMembers); 245 } 246 }); 247 } 248 } 249 else if (dynamicGroup.isSelected()) 250 { 251 boolean errorFound = false; 252 String f = filter.getText().trim(); 253 if (f.length() == 0) 254 { 255 errors.add(ERR_CTRL_PANEL_GROUP_FILTER_REQUIRED.get()); 256 errorFound = true; 257 } 258 else 259 { 260 try 261 { 262 LDAPURL.decode(f, true); 263 } 264 catch (OpenDsException ode) 265 { 266 errors.add(ERR_CTRL_PANEL_GROUP_FILTER_NOT_VALID.get(ode.getMessageObject())); 267 } 268 } 269 if (errorFound) 270 { 271 setSecondaryInvalid(lLDAPURL); 272 setPrimaryInvalid(lMembers); 273 } 274 } 275 else 276 { 277 boolean errorFound = false; 278 String ref = referenceGroup.getText().trim(); 279 try 280 { 281 DN.valueOf(ref); 282 if (!entryExists(ref)) 283 { 284 errorFound = true; 285 errors.add(ERR_CTRL_PANEL_REFERENCE_GROUP_NOT_FOUND.get()); 286 } 287 else if (!hasObjectClass(ref, ServerConstants.OC_GROUP_OF_URLS)) 288 { 289 errorFound = true; 290 errors.add(ERR_CTRL_PANEL_REFERENCE_GROUP_NOT_DYNAMIC.get()); 291 } 292 } 293 catch (OpenDsException ode) 294 { 295 errorFound = true; 296 errors.add(ERR_CTRL_PANEL_REFERENCE_GROUP_NOT_VALID.get(ode.getMessageObject())); 297 } 298 if (errorFound) 299 { 300 setSecondaryInvalid(lReferenceGroup); 301 setPrimaryInvalid(lMembers); 302 } 303 } 304 } 305 306 307 /** 308 * Creates the layout of the panel (but the contents are not populated here). 309 */ 310 private void createLayout() 311 { 312 GridBagConstraints gbc = new GridBagConstraints(); 313 LocalizableMessage[] ls = { 314 INFO_CTRL_PANEL_NEW_GROUP_NAME_LABEL.get(), 315 INFO_CTRL_PANEL_NEW_GROUP_DESCRIPTION_LABEL.get(), 316 INFO_CTRL_PANEL_NEW_GROUP_MEMBERS_LABEL.get(), 317 INFO_CTRL_PANEL_NEW_GROUP_ENTRY_DN_LABEL.get() 318 }; 319 int i = 0; 320 for (LocalizableMessage l : ls) 321 { 322 labels[i].setText(l.toString()); 323 i++; 324 } 325 Utilities.setRequiredIcon(lName); 326 Utilities.setRequiredIcon(lMembers); 327 328 gbc.gridwidth = 2; 329 gbc.gridy = 0; 330 addErrorPane(gbc); 331 332 gbc.gridy ++; 333 gbc.gridwidth = 1; 334 gbc.weighty = 0.0; 335 gbc.gridx = 1; 336 gbc.anchor = GridBagConstraints.EAST; 337 gbc.fill = GridBagConstraints.NONE; 338 JLabel requiredLabel = createRequiredLabel(); 339 gbc.insets.bottom = 10; 340 add(requiredLabel, gbc); 341 342 gbc.gridy ++; 343 gbc.fill = GridBagConstraints.HORIZONTAL; 344 gbc.anchor = GridBagConstraints.WEST; 345 gbc.insets.bottom = 0; 346 347 staticGroup = Utilities.createRadioButton( 348 INFO_CTRL_PANEL_STATIC_GROUP_LABEL.get()); 349 dynamicGroup = Utilities.createRadioButton( 350 INFO_CTRL_PANEL_DYNAMIC_GROUP_LABEL.get()); 351 virtualGroup = Utilities.createRadioButton( 352 INFO_CTRL_PANEL_VIRTUAL_STATIC_GROUP_LABEL.get()); 353 ButtonGroup group = new ButtonGroup(); 354 group.add(staticGroup); 355 group.add(dynamicGroup); 356 group.add(virtualGroup); 357 staticGroup.setSelected(true); 358 ActionListener actionListener = new ActionListener() 359 { 360 /** {@inheritDoc} */ 361 public void actionPerformed(ActionEvent ev) 362 { 363 checkEnabling(); 364 } 365 }; 366 staticGroup.addActionListener(actionListener); 367 dynamicGroup.addActionListener(actionListener); 368 virtualGroup.addActionListener(actionListener); 369 370 JLabel[] labels = {lName, lDescription, lMembers}; 371 Component[] comps = {name, description, staticGroup}; 372 Component[] inlineHelp = {null, null, null}; 373 374 for (i=0 ; i< labels.length; i++) 375 { 376 gbc.insets.left = 0; 377 gbc.weightx = 0.0; 378 gbc.gridx = 0; 379 gbc.gridwidth = 1; 380 add(labels[i], gbc); 381 gbc.insets.left = 10; 382 gbc.weightx = 1.0; 383 gbc.gridx = 1; 384 add(comps[i], gbc); 385 if (inlineHelp[i] != null) 386 { 387 gbc.insets.top = 3; 388 gbc.gridy ++; 389 add(inlineHelp[i], gbc); 390 } 391 gbc.insets.top = 10; 392 gbc.gridy ++; 393 } 394 gbc.insets.top = 5; 395 lMemberDNs = Utilities.createDefaultLabel( 396 INFO_CTRL_PANEL_GROUP_MEMBER_DNS_LABEL.get()); 397 gbc.insets.left = 30; 398 add(lMemberDNs, gbc); 399 staticMembers = Utilities.createTextArea(LocalizableMessage.EMPTY, 8, 40); 400 JScrollPane scroll = Utilities.createScrollPane(staticMembers); 401 gbc.weighty = 1.0; 402 gbc.fill = GridBagConstraints.BOTH; 403 gbc.gridy ++; 404 JPanel p = new JPanel(new GridBagLayout()); 405 p.setOpaque(false); 406 lLDAPURL = Utilities.createDefaultLabel( 407 INFO_CTRL_PANEL_GROUP_FILTER_LABEL.get()); 408 add(p, gbc); 409 GridBagConstraints gbc2 = new GridBagConstraints(); 410 gbc2.gridx = 0; 411 gbc2.weightx = 1.0; 412 gbc2.weighty = 1.0; 413 gbc2.fill = GridBagConstraints.BOTH; 414 p.add(scroll, gbc2); 415 gbc2.insets.left = 5; 416 gbc2.weightx = 0.0; 417 gbc2.fill = GridBagConstraints.HORIZONTAL; 418 gbc2.gridx ++; 419 addMembers = Utilities.createButton( 420 INFO_CTRL_PANEL_ADD_MEMBERS_BUTTON.get()); 421 gbc2.anchor = GridBagConstraints.NORTH; 422 p.add(addMembers, gbc2); 423 424 addMembers.addActionListener(new ActionListener() 425 { 426 /** {@inheritDoc} */ 427 public void actionPerformed(ActionEvent ev) 428 { 429 addMembersClicked(); 430 } 431 }); 432 433 gbc.insets.left = 10; 434 gbc.insets.top = 10; 435 gbc.fill = GridBagConstraints.HORIZONTAL; 436 gbc.weighty = 0.0; 437 gbc.gridy ++; 438 add(dynamicGroup, gbc); 439 gbc.insets.top = 5; 440 gbc.weightx = 0.0; 441 gbc.gridy ++; 442 p = new JPanel(new GridBagLayout()); 443 p.setOpaque(false); 444 gbc.insets.left = 30; 445 add(p, gbc); 446 447 gbc2 = new GridBagConstraints(); 448 gbc2.gridx = 0; 449 gbc2.fill = GridBagConstraints.HORIZONTAL; 450 p.add(lLDAPURL, gbc2); 451 gbc2.insets.left = 5; 452 gbc2.weightx = 1.0; 453 gbc2.gridx ++; 454 p.add(filter, gbc2); 455 456 lReferenceGroup = Utilities.createDefaultLabel( 457 INFO_CTRL_PANEL_DYNAMIC_GROUP_REFERENCE_LABEL.get()); 458 gbc.insets.left = 30; 459 p = new JPanel(new GridBagLayout()); 460 p.setOpaque(false); 461 gbc.gridy ++; 462 add(p, gbc); 463 464 gbc.gridy ++; 465 gbc.gridx = 1; 466 gbc.insets.left = 10; 467 gbc.insets.top = 10; 468 gbc.fill = GridBagConstraints.HORIZONTAL; 469 gbc.weighty = 0.0; 470 add(virtualGroup, gbc); 471 gbc.insets.top = 5; 472 gbc.weightx = 0.0; 473 474 gbc.insets.top = 10; 475 gbc.gridy ++; 476 gbc.insets.left = 0; 477 gbc.weightx = 0.0; 478 gbc.gridx = 0; 479 gbc.gridwidth = 1; 480 add(lDn, gbc); 481 gbc.insets.left = 10; 482 gbc.weightx = 1.0; 483 gbc.gridx = 1; 484 add(dn, gbc); 485 486 gbc2 = new GridBagConstraints(); 487 gbc2.gridx = 0; 488 gbc2.fill = GridBagConstraints.HORIZONTAL; 489 p.add(lReferenceGroup, gbc2); 490 gbc2.insets.left = 5; 491 gbc2.weightx = 1.0; 492 gbc2.gridx ++; 493 p.add(referenceGroup, gbc2); 494 gbc2.weightx = 0.0; 495 gbc2.gridx ++; 496 browseReferenceGroup = 497 Utilities.createButton(INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get()); 498 browseReferenceGroup.addActionListener(new ActionListener() 499 { 500 /** {@inheritDoc} */ 501 public void actionPerformed(ActionEvent ev) 502 { 503 browseReferenceGroupClicked(); 504 } 505 }); 506 p.add(browseReferenceGroup, gbc2); 507 508 509 DocumentListener listener = new DocumentListener() 510 { 511 /** {@inheritDoc} */ 512 public void insertUpdate(DocumentEvent ev) 513 { 514 updateDNValue(); 515 } 516 517 /** {@inheritDoc} */ 518 public void changedUpdate(DocumentEvent ev) 519 { 520 insertUpdate(ev); 521 } 522 523 /** {@inheritDoc} */ 524 public void removeUpdate(DocumentEvent ev) 525 { 526 insertUpdate(ev); 527 } 528 }; 529 JTextField[] toAddListener = {name}; 530 for (JTextField tf : toAddListener) 531 { 532 tf.getDocument().addDocumentListener(listener); 533 } 534 535 DropTargetListener dropTargetlistener = new DropTargetListener() 536 { 537 /** {@inheritDoc} */ 538 public void dragEnter(DropTargetDragEvent e) 539 { 540 } 541 542 /** {@inheritDoc} */ 543 public void dragExit(DropTargetEvent e) 544 { 545 } 546 547 /** {@inheritDoc} */ 548 public void dragOver(DropTargetDragEvent e) 549 { 550 } 551 552 /** {@inheritDoc} */ 553 public void dropActionChanged(DropTargetDragEvent e) 554 { 555 } 556 557 /** {@inheritDoc} */ 558 public void drop(DropTargetDropEvent e) 559 { 560 try { 561 Transferable tr = e.getTransferable(); 562 563 //flavor not supported, reject drop 564 if (!tr.isDataFlavorSupported(DndBrowserNodes.INFO_FLAVOR)) 565 { 566 e.rejectDrop(); 567 } 568 569 //cast into appropriate data type 570 DndBrowserNodes nodes = 571 (DndBrowserNodes) tr.getTransferData(DndBrowserNodes.INFO_FLAVOR); 572 573 Component comp = e.getDropTargetContext().getComponent(); 574 if (comp == staticMembers) 575 { 576 StringBuilder sb = new StringBuilder(); 577 sb.append(staticMembers.getText()); 578 for (BrowserNodeInfo node : nodes.getNodes()) 579 { 580 if (sb.length() > 0) 581 { 582 sb.append("\n"); 583 } 584 sb.append(node.getNode().getDN()); 585 } 586 staticMembers.setText(sb.toString()); 587 staticMembers.setCaretPosition(sb.length()); 588 } 589 else if (comp == referenceGroup 590 && nodes.getNodes().length > 0) 591 { 592 String dn = nodes.getNodes()[0].getNode().getDN(); 593 referenceGroup.setText(dn); 594 referenceGroup.setCaretPosition(dn.length()); 595 } 596 e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); 597 e.getDropTargetContext().dropComplete(true); 598 } 599 catch (IOException | UnsupportedFlavorException io) 600 { 601 e.rejectDrop(); 602 } 603 } 604 }; 605 new DropTarget(staticMembers, dropTargetlistener); 606 new DropTarget(referenceGroup, dropTargetlistener); 607 608 checkEnabling(); 609 } 610 611 private void updateDNValue() 612 { 613 String value = name.getText().trim(); 614 if (value.length() > 0) 615 { 616 String rdn = Utilities.getRDNString("cn", value); 617 dn.setText(rdn+","+parentNode.getDN()); 618 } 619 else 620 { 621 dn.setText(","+parentNode.getDN()); 622 } 623 } 624 625 private void addMembersClicked() 626 { 627 if (membersDlg == null) 628 { 629 membersPanel = new LDAPEntrySelectionPanel(); 630 membersPanel.setTitle(INFO_CTRL_PANEL_ADD_MEMBERS_LABEL.get()); 631 membersPanel.setFilter(LDAPEntrySelectionPanel.Filter.USERS); 632 membersPanel.setMultipleSelection(true); 633 membersPanel.setInfo(getInfo()); 634 membersDlg = new GenericDialog(Utilities.getFrame(this), membersPanel); 635 Utilities.centerGoldenMean(membersDlg, 636 Utilities.getParentDialog(this)); 637 membersDlg.setModal(true); 638 } 639 membersDlg.setVisible(true); 640 String[] dns = membersPanel.getDNs(); 641 if (dns.length > 0) 642 { 643 StringBuilder sb = new StringBuilder(); 644 sb.append(staticMembers.getText()); 645 for (String dn : dns) 646 { 647 if (sb.length() > 0) 648 { 649 sb.append("\n"); 650 } 651 sb.append(dn); 652 } 653 staticMembers.setText(sb.toString()); 654 staticMembers.setCaretPosition(sb.length()); 655 } 656 } 657 658 private void browseReferenceGroupClicked() 659 { 660 if (referenceGroupDlg == null) 661 { 662 referenceGroupPanel = new LDAPEntrySelectionPanel(); 663 referenceGroupPanel.setTitle( 664 INFO_CTRL_PANEL_CHOOSE_REFERENCE_GROUP.get()); 665 referenceGroupPanel.setFilter( 666 LDAPEntrySelectionPanel.Filter.DYNAMIC_GROUPS); 667 referenceGroupPanel.setMultipleSelection(false); 668 referenceGroupPanel.setInfo(getInfo()); 669 referenceGroupDlg = new GenericDialog(Utilities.getFrame(this), 670 referenceGroupPanel); 671 Utilities.centerGoldenMean(referenceGroupDlg, 672 Utilities.getParentDialog(this)); 673 referenceGroupDlg.setModal(true); 674 } 675 referenceGroupDlg.setVisible(true); 676 String[] dns = referenceGroupPanel.getDNs(); 677 if (dns.length > 0) 678 { 679 referenceGroup.setText(dns[0]); 680 } 681 } 682 683 /** {@inheritDoc} */ 684 protected String getLDIF() 685 { 686 StringBuilder sb = new StringBuilder(); 687 sb.append("dn: ").append(dn.getText()).append("\n"); 688 689 String[] attrNames = {"cn", "description"}; 690 JTextField[] textFields = {name, description}; 691 for (int i=0; i<attrNames.length; i++) 692 { 693 String value = textFields[i].getText().trim(); 694 if (value.length() > 0) 695 { 696 sb.append(attrNames[i]).append(": ").append(value).append("\n"); 697 } 698 } 699 700 sb.append("objectclass: top\n"); 701 if (staticGroup.isSelected()) 702 { 703 sb.append("objectClass: ").append(ServerConstants.OC_GROUP_OF_NAMES); 704 String[] members = staticMembers.getText().split("\n"); 705 LinkedHashSet<DN> dns = new LinkedHashSet<>(); 706 for (String member : members) 707 { 708 member = member.trim(); 709 if (member.length() > 0) 710 { 711 try 712 { 713 dns.add(DN.valueOf(member)); 714 } 715 catch (OpenDsException ode) 716 { 717 throw new RuntimeException("Unexpected error decoding DN: "+ 718 member, ode); 719 } 720 } 721 } 722 723 for (DN dn : dns) 724 { 725 sb.append("\n").append(ServerConstants.ATTR_MEMBER) 726 .append(": ").append(dn); 727 } 728 } 729 else if (dynamicGroup.isSelected()) 730 { 731 sb.append("objectClass: ").append(ServerConstants.OC_GROUP_OF_URLS) 732 .append("\n"); 733 sb.append(ServerConstants.ATTR_MEMBER_URL).append(": ") 734 .append(filter.getText().trim()); 735 } 736 else 737 { 738 sb.append("objectClass: ds-virtual-static-group\n"); 739 sb.append("objectClass: ").append(ServerConstants.OC_GROUP_OF_NAMES) 740 .append("\n"); 741 sb.append("ds-target-group-dn: ").append(referenceGroup.getText().trim()); 742 } 743 744 return sb.toString(); 745 } 746 747 private void checkEnabling() 748 { 749 staticMembers.setEnabled(staticGroup.isSelected()); 750 addMembers.setEnabled(staticGroup.isSelected()); 751 filter.setEnabled(dynamicGroup.isSelected()); 752 referenceGroup.setEnabled(virtualGroup.isSelected()); 753 browseReferenceGroup.setEnabled(virtualGroup.isSelected()); 754 755 lMemberDNs.setEnabled(staticGroup.isSelected()); 756 lLDAPURL.setEnabled(dynamicGroup.isSelected()); 757 lReferenceGroup.setEnabled(virtualGroup.isSelected()); 758 } 759} 760