/*
 * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code 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
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/*
 * @test
 * @bug 4635618
 * @summary Support for manipulating LDAP Names
 */

import javax.naming.ldap.*;
import java.util.*;
import javax.naming.*;
import java.io.*;

/**
 * LdapName tests- These tests are for testing the methods of
 * javax.naming.Name interface as it applied to LdapName.
 */
public class NameTests {

    public static void main(String args[]) throws Exception {

        String[] rdnStr = new String[] {"one=voilet"};

        ArrayList rdnList = new ArrayList();

        for (int i = 0; i < rdnStr.length; i++) {
            rdnList.add(i, new Rdn(rdnStr[i]));
        }
        LdapName dn = new LdapName(rdnList);

        Collection rdns = dn.getRdns();
        System.out.println("size is :" + dn.size());
        System.out.println("isEmpty :" + dn.isEmpty());
        System.out.println("************Printing as Rdns*********");
        Iterator iter = rdns.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }

        System.out.println();
        System.out.println("************Printing the Enumeration*********");
        Enumeration dnEnum = dn.getAll();
        while (dnEnum.hasMoreElements()) {
            System.out.println(dnEnum.nextElement());
        }

        // addAll tests
        System.out.println();
        LdapName nameSuffix = new LdapName("two=Indigo");
        System.out.println("addAll():" + dn.addAll(nameSuffix));

        ArrayList list = new ArrayList();
        list.add(new Rdn("five=Yellow"));
        System.out.println("Rdn- addAll():" + dn.addAll(list));

        nameSuffix = new LdapName("three=Blue");
        System.out.println();
        System.out.println("addAll at pos = 2");
        System.out.println("addAll():" + dn.addAll(2, nameSuffix));

        list = new ArrayList();
        list.add(new Rdn("four=Green"));
        System.out.println();
        System.out.println("addAll at pos = 3");
        System.out.println("Rdn- addAll():" + dn.addAll(3, list));

        // add() tests
        Rdn rdn;
        System.out.println();
        System.out.println("add():" + dn.add("eight=white"));
        rdn = new Rdn("nine=Black");
        System.out.println();
        System.out.println("Rdn- add():" + dn.add(rdn));

        /*
        Rdn nullRdn = null;
        System.out.println("Rdn- add() with null RDN:" +
                        dn.add(nullRdn));
        */

        System.out.println();
        System.out.println("add() at pos 5");
        System.out.println("add():" + dn.add(5, "six=Orange"));
        rdn = new Rdn("six=Orange");
        System.out.println();
        System.out.println("add() at pos 6");
        System.out.println("Rdn- add():" + dn.add(6, "seven=Red"));

        // remove tests
        System.out.println();
        System.out.println("Removing entries at positions: 7, 8");
        System.out.println("Removed:" + dn.remove(8));
        System.out.println("Removed:" + dn.remove(7));

        // get tests
        System.out.println();
        System.out.println("toString():" + dn);
        int size  = dn.size();
        System.out.println("get(0):" + dn.get(0));
        System.out.println("get(size() - 1):" + dn.get(size - 1));
        System.out.println("getRdn(0):" + dn.getRdn(0));
        System.out.println("getRdn(size() - 1):" + dn.getRdn(size - 1));

        System.out.println();
        System.out.println("********Prefixes**********");
        System.out.println("getPrefix(0):" + dn.getPrefix(0));
        System.out.println("getPrefix(size / 2):" + dn.getPrefix(size / 2));
        System.out.println("getPrefix(size):" + dn.getPrefix(size));

        System.out.println();
        System.out.println("********Suffixes**********");
        System.out.println("getSuffix(0):" + dn.getSuffix(0));
        System.out.println("getSuffix(size/2):" + dn.getSuffix(size / 2));
        System.out.println("getSuffix(size):" + dn.getSuffix(size));

        System.out.println();
        System.out.println("startsWith(" + rdnStr[0] + "):" +
                                dn.startsWith(new LdapName(rdnStr[0])));

        String lastEntry = "seven=red";
        System.out.println("startsWith(" + lastEntry + "):" +
                                dn.startsWith(new LdapName(lastEntry)));

        System.out.println("compositeName- startsWith(" +
                        rdnStr[0] + "): " + dn.startsWith(
                                        new CompositeName(rdnStr[0])));

        java.util.List prefixList = (dn.getRdns()).subList(0, size /2);
        System.out.println("Rdn - startsWith(" + prefixList + "):" +
                                dn.startsWith(prefixList));

        System.out.println("Rdn - startsWith() - empty RDN list:" +
                                dn.startsWith(new ArrayList()));

        System.out.println();
        System.out.println("endsWith(" + rdnStr[0] + "):" +
                                dn.endsWith(new LdapName(rdnStr[0])));

        System.out.println("endsWith(" + lastEntry + "):" +
                                dn.endsWith(new LdapName(lastEntry)));

        System.out.println("compositeName- endsWith(" + rdnStr[0] + "):    " +
                dn.endsWith(new CompositeName(rdnStr[0])));

        System.out.println("Rdn - endsWith(" + prefixList + "):" +
                                dn.endsWith(prefixList));

        System.out.println("Rdn - endsWith() empty RDN list:" +
                                dn.endsWith(new ArrayList()));

        // test clone
        System.out.println();
        System.out.println("cloned name:" + dn.clone());

        // test serialization
        ObjectOutputStream out = new ObjectOutputStream(
                                    new FileOutputStream("dn.ser"));
        out.writeObject(dn);
        out.close();

        ObjectInputStream in = new ObjectInputStream(
                                    new FileInputStream("dn.ser"));

        System.out.println();
        System.out.println("Deserialized name:" + in.readObject());
        in.close();
    }
}
