Mega Code Archive

 
Categories / Java / JNDI LDAP
 

This program demonstrates access to a hierarchical database through LDAP

/*    This program is a part of the companion code for Core Java 8th ed.    (http://horstmann.com/corejava)    This program is free software: you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation, either version 3 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program.  If not, see <http://www.gnu.org/licenses/>. */ import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.naming.*; import javax.naming.directory.*; import javax.swing.*; /**  * This program demonstrates access to a hierarchical database through LDAP  * @version 1.01 2007-06-28  * @author Cay Horstmann  */ public class LDAPTest {    public static void main(String[] args)    {       EventQueue.invokeLater(new Runnable()          {             public void run()             {                JFrame frame = new LDAPFrame();                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                frame.setVisible(true);             }          });    } } /**  * The frame that holds the data panel and the navigation buttons.  */ class LDAPFrame extends JFrame {    public LDAPFrame()    {       setTitle("LDAPTest");       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);       JPanel northPanel = new JPanel();       northPanel.setLayout(new java.awt.GridLayout(1, 2, 3, 1));       northPanel.add(new JLabel("uid", SwingConstants.RIGHT));       uidField = new JTextField();       northPanel.add(uidField);       add(northPanel, BorderLayout.NORTH);       JPanel buttonPanel = new JPanel();       add(buttonPanel, BorderLayout.SOUTH);       findButton = new JButton("Find");       findButton.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                findEntry();             }          });       buttonPanel.add(findButton);       saveButton = new JButton("Save");       saveButton.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                saveEntry();             }          });       buttonPanel.add(saveButton);       deleteButton = new JButton("Delete");       deleteButton.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                deleteEntry();             }          });       buttonPanel.add(deleteButton);       addWindowListener(new WindowAdapter()          {             public void windowClosing(WindowEvent event)             {                try                {                   if (context != null) context.close();                }                catch (NamingException e)                {                   e.printStackTrace();                }             }          });    }    /**     * Finds the entry for the uid in the text field.     */    public void findEntry()    {       try       {          if (scrollPane != null) remove(scrollPane);          String dn = "uid=" + uidField.getText() + ",ou=people,dc=mycompany,dc=com";          if (context == null) context = getContext();          attrs = context.getAttributes(dn);          dataPanel = new DataPanel(attrs);          scrollPane = new JScrollPane(dataPanel);          add(scrollPane, BorderLayout.CENTER);          validate();          uid = uidField.getText();       }       catch (NamingException e)       {          JOptionPane.showMessageDialog(this, e);       }       catch (IOException e)       {          JOptionPane.showMessageDialog(this, e);       }    }    /**     * Saves the changes that the user made.     */    public void saveEntry()    {       try       {          if (dataPanel == null) return;          if (context == null) context = getContext();          if (uidField.getText().equals(uid)) // update existing entry          {             String dn = "uid=" + uidField.getText() + ",ou=people,dc=mycompany,dc=com";             Attributes editedAttrs = dataPanel.getEditedAttributes();             NamingEnumeration<? extends Attribute> attrEnum = attrs.getAll();             while (attrEnum.hasMore())             {                Attribute attr = attrEnum.next();                String id = attr.getID();                Attribute editedAttr = editedAttrs.get(id);                if (editedAttr != null && !attr.get().equals(editedAttr.get())) context                      .modifyAttributes(dn, DirContext.REPLACE_ATTRIBUTE, new BasicAttributes(id,                            editedAttr.get()));             }          }          else          // create new entry          {             String dn = "uid=" + uidField.getText() + ",ou=people,dc=mycompany,dc=com";             attrs = dataPanel.getEditedAttributes();             Attribute objclass = new BasicAttribute("objectClass");             objclass.add("uidObject");             objclass.add("person");             attrs.put(objclass);             attrs.put("uid", uidField.getText());             context.createSubcontext(dn, attrs);          }          findEntry();       }       catch (NamingException e)       {          JOptionPane.showMessageDialog(LDAPFrame.this, e);          e.printStackTrace();       }       catch (IOException e)       {          JOptionPane.showMessageDialog(LDAPFrame.this, e);          e.printStackTrace();       }    }    /**     * Deletes the entry for the uid in the text field.     */    public void deleteEntry()    {       try       {          String dn = "uid=" + uidField.getText() + ",ou=people,dc=mycompany,dc=com";          if (context == null) context = getContext();          context.destroySubcontext(dn);          uidField.setText("");          remove(scrollPane);          scrollPane = null;          repaint();       }       catch (NamingException e)       {          JOptionPane.showMessageDialog(LDAPFrame.this, e);          e.printStackTrace();       }       catch (IOException e)       {          JOptionPane.showMessageDialog(LDAPFrame.this, e);          e.printStackTrace();       }    }    /**     * Gets a context from the properties specified in the file ldapserver.properties     * @return the directory context     */    public static DirContext getContext() throws NamingException, IOException    {       Properties props = new Properties();       FileInputStream in = new FileInputStream("ldapserver.properties");       props.load(in);       in.close();       String url = props.getProperty("ldap.url");       String username = props.getProperty("ldap.username");       String password = props.getProperty("ldap.password");       Hashtable<String, String> env = new Hashtable<String, String>();       env.put(Context.SECURITY_PRINCIPAL, username);       env.put(Context.SECURITY_CREDENTIALS, password);       DirContext initial = new InitialDirContext(env);       DirContext context = (DirContext) initial.lookup(url);       return context;    }    public static final int DEFAULT_WIDTH = 300;    public static final int DEFAULT_HEIGHT = 200;    private JButton findButton;    private JButton saveButton;    private JButton deleteButton;    private JTextField uidField;    private DataPanel dataPanel;    private Component scrollPane;    private DirContext context;    private String uid;    private Attributes attrs; } /**  * This panel displays the contents of a result set.  */ class DataPanel extends JPanel {    /**     * Constructs the data panel.     * @param attributes the attributes of the given entry     */    public DataPanel(Attributes attrs) throws NamingException    {       setLayout(new java.awt.GridLayout(0, 2, 3, 1));       NamingEnumeration<? extends Attribute> attrEnum = attrs.getAll();       while (attrEnum.hasMore())       {          Attribute attr = attrEnum.next();          String id = attr.getID();          NamingEnumeration<?> valueEnum = attr.getAll();          while (valueEnum.hasMore())          {             Object value = valueEnum.next();             if (id.equals("userPassword")) value = new String((byte[]) value);             JLabel idLabel = new JLabel(id, SwingConstants.RIGHT);             JTextField valueField = new JTextField("" + value);             if (id.equals("objectClass")) valueField.setEditable(false);             if (!id.equals("uid"))             {                add(idLabel);                add(valueField);             }          }       }    }    public Attributes getEditedAttributes()    {       Attributes attrs = new BasicAttributes();       for (int i = 0; i < getComponentCount(); i += 2)       {          JLabel idLabel = (JLabel) getComponent(i);          JTextField valueField = (JTextField) getComponent(i + 1);          String id = idLabel.getText();          String value = valueField.getText();          if (id.equals("userPassword")) attrs.put("userPassword", value.getBytes());          else if (!id.equals("") && !id.equals("objectClass")) attrs.put(id, value);       }       return attrs;    } } //File: ldapserver.properties ldap.username=cn=Manager,dc=mycompany,dc=com ldap.password=secret ldap.url=ldap://localhost:389 //File sample.ldif # Define top-level entry dn: dc=mycompany,dc=com objectClass: dcObject objectClass: organization dc: mycompany o: Core Java Team # Define an entry to contain people # searches for users are based on this entry dn: ou=people,dc=mycompany,dc=com objectClass: organizationalUnit ou: people # Define a user entry for John Q. Public dn: uid=jqpublic,ou=people,dc=mycompany,dc=com objectClass: person objectClass: uidObject uid: jqpublic sn: Public cn: John Q. Public telephoneNumber: +1 408 555 0017 userPassword: wombat # Define a user entry for Jane Doe dn: uid=jdoe,ou=people,dc=mycompany,dc=com objectClass: person objectClass: uidObject uid: jdoe sn: Doe cn: Jane Doe telephoneNumber: +1 408 555 0029 userPassword: heffalump # Define an entry to contain LDAP groups # searches for roles are based on this entry dn: ou=groups,dc=mycompany,dc=com objectClass: organizationalUnit ou: groups # Define an entry for the "techstaff" group dn: cn=techstaff,ou=groups,dc=mycompany,dc=com objectClass: groupOfUniqueNames cn: techstaff uniqueMember: uid=jdoe,ou=people,dc=mycompany,dc=com # Define an entry for the "staff" group dn: cn=staff,ou=groups,dc=mycompany,dc=com objectClass: groupOfUniqueNames cn: staff uniqueMember: uid=jqpublic,ou=people,dc=mycompany,dc=com uniqueMember: uid=jdoe,ou=people,dc=mycompany,dc=com