/**
     * Demonstracja użycia pakietu 
     * com.novell.ldap   
     * 
	 * @author Wiesław Dudek
	 * @version 1.0
	 */

import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPModification;

import java.io.UnsupportedEncodingException;

public class LdapSample
{
    public static void main( String[] args )
    {
        ////////////////////////////////////
    	//USTAWIENIA ZMIENNYCH
    	////////////////////////////////////
    	
        int port = 389;
        int wersja  = LDAPConnection.LDAP_V3;

        String serwer = "localhost";
        String login  = "identyfikator=manager,miasto=krakow,kraj=pl";
        String haslo  = "manager";
        String wezel  = "miasto=krakow,kraj=pl";        
        
        LDAPConnection polaczenie = new LDAPConnection();
        
    	///////////////////////////////////
    	// TEST WSTAWIANIA WĘZŁA (DN)
    	///////////////////////////////////

        
        LDAPAttributeSet atrybuty = new LDAPAttributeSet();

        // tworzenie atrybutów dodawanego węzła
        atrybuty.add( new LDAPAttribute( 
                             "objectclass", new String("osoba")));                
        atrybuty.add( new LDAPAttribute("imie", 
                new String[]{"Jan", "Piotr", "Zenon"}));               
        atrybuty.add( new LDAPAttribute("nazwisko", new String("Kurpa")));
        atrybuty.add( new LDAPAttribute("identyfikator", new String("kurpaj")));

        String  dodawanyWezel  = "identyfikator=kurpaj,"+wezel;      
        LDAPEntry nowyWezel = new LDAPEntry( dodawanyWezel, atrybuty );

        try {
        	
            // łączenie z serwerem
            polaczenie.connect( serwer, port );
            
            // uwierzytelnienie
            polaczenie.bind( wersja, login, haslo.getBytes("UTF8") );
            
            // dodanie węzła 
            polaczenie.add( nowyWezel );
            System.out.println( "\nWęzeł dodany: " + dodawanyWezel );

            // rozłączenie
            polaczenie.disconnect();
        }
        catch( LDAPException e ) {
            System.out.println( "Błąd:  " + e.toString());
        }
        catch( UnsupportedEncodingException e ) {
            System.out.println( "Błąd: " + e.toString() );
        }
        
        ///////////////////////////////////////
        //TEST MODYFIKOWANIA ATRYBUTÓW WĘZŁA
        ///////////////////////////////////////
        
        wezel=dodawanyWezel;
        try {
            // połączenie z serwerem
            polaczenie.connect( serwer, port);
            
            // uwierzytelnienie
            polaczenie.bind( wersja, login, haslo.getBytes("UTF8") );

            try {
                // dodanie atrybutu do węzła

                LDAPModification[] dododania={new LDAPModification(LDAPModification.ADD, new LDAPAttribute( "wiek","20"))} ;                
            	
                polaczenie.modify( wezel, dododania);
                System.out.println("Dodano atrybut: wiek");
                
            } catch( LDAPException ex ) {
                if(ex.getResultCode()!=LDAPException.ATTRIBUTE_OR_VALUE_EXISTS){ 
                    System.out.println("Nie powiodło się dodanie atrybutu: " +
                                ex.toString());
                }                    
            }

          	LDAPModification[] dozmiany = {new LDAPModification(LDAPModification.REPLACE,new LDAPAttribute( "nazwisko",new String("Kowalski")))};            
            polaczenie.modify( wezel, dozmiany);
            System.out.println("Zmieniono atrybut");

            LDAPModification[] dousuniecia ={ new LDAPModification(LDAPModification.DELETE,new LDAPAttribute( "wiek"))};
            polaczenie.modify( wezel, dousuniecia);
            System.out.println("Usunięto atrybut: wiek");

           // rozłaczenie

            polaczenie.disconnect();
        }
        catch( LDAPException ex ) {
            if ( ex.getResultCode() == LDAPException.NO_SUCH_OBJECT )
               System.err.println( "Błąd: Brak węzła" );
            else if ( ex.getResultCode() ==
                                    LDAPException.INSUFFICIENT_ACCESS_RIGHTS )
               System.err.println( "Błąd: niewystarczające prawa dostępu" );
            else if ( ex.getResultCode() ==
                                       LDAPException.ATTRIBUTE_OR_VALUE_EXISTS )
               System.err.println( "Błąd: Atrybut lub wartość istnieje" );
            else {
               System.err.println( "Błąd: " + ex.toString() );
            }       
            System.exit(1);
        }   
        catch( UnsupportedEncodingException ex ) {
            System.out.println( "Błąd: " + ex.toString() );
        }     

        /////////////////////////////
        //TEST USUWANIA WĘZŁA
        /////////////////////////////
        
        LDAPConnection lc = new LDAPConnection();

        try {
           // łączenie z serwerem
            lc.connect( serwer, port );
            
           // uwierzytelnienie
            lc.bind( wersja, login, haslo.getBytes("UTF8") );

           // usunięcie węzła
            lc.delete( wezel );
            System.out.println( "\nWęzeł: " + wezel + " usunięty." );

           // rozłączenie

            lc.disconnect();
        }
        catch( LDAPException e ) {
            if ( e.getResultCode() == LDAPException.NO_SUCH_OBJECT )
               System.err.println( "Błąd: Węzeł nieistnieje" );
            else if ( e.getResultCode() ==
                              LDAPException.INSUFFICIENT_ACCESS_RIGHTS )
                    System.err.println( "Błąd: Niewystarczające prawa" );
                 else
                    System.err.println( "Błąd: " + e.toString() );
        }        
        catch( UnsupportedEncodingException e ) {
            System.out.println( "Błąd: " + e.toString() );
        }

        
        System.exit(0);
    }
}
