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