/*
 *   Licensed to the Apache Software Foundation (ASF) under one
 *   or more contributor license agreements.  See the NOTICE file
 *   distributed with this work for additional information
 *   regarding copyright ownership.  The ASF licenses this file
 *   to you under the Apache License, Version 2.0 (the
 *   "License"); you may not use this file except in compliance
 *   with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing,
 *   software distributed under the License is distributed on an
 *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *   KIND, either express or implied.  See the License for the
 *   specific language governing permissions and limitations
 *   under the License.
 *
 */
package org.apache.directory.fortress.core;


import org.apache.commons.collections.CollectionUtils;
import org.slf4j.LoggerFactory;
import org.apache.directory.fortress.core.model.OrgUnit;
import org.apache.directory.fortress.core.impl.TestUtils;
import org.apache.directory.fortress.core.model.UserAdminRole;
import org.apache.directory.fortress.core.model.Address;
import org.apache.directory.fortress.core.model.Permission;
import org.apache.directory.fortress.core.model.Role;
import org.apache.directory.fortress.core.model.User;
import org.apache.directory.fortress.core.model.UserRole;
import org.apache.directory.fortress.core.model.Constraint;

import java.util.ArrayList;
import java.util.List;
import java.util.Enumeration;


/**
 * Test class for driving Fortress RBAC review API within a console.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
class ReviewMgrConsole
{
    private ReviewMgr rm;
    private static final String CLS_NM = ReviewMgrConsole.class.getName();
    private static final org.slf4j.Logger LOG = LoggerFactory.getLogger( CLS_NM );


    /**
     * Constructor for the ReviewMgrConsole object
     */
    ReviewMgrConsole()
    {
        try
        {
            rm = ReviewMgrFactory.createInstance( TestUtils.getContext() );
        }
        catch ( org.apache.directory.fortress.core.SecurityException e )
        {
            LOG.error( " constructor caught SecurityException  rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
    }


    /**
     *
     */
    void readRole()
    {
        ReaderUtil.clearScreen();
        try
        {
            System.out.println( "Enter Role name to read:" );
            Role role = new Role();
            role.setName( ReaderUtil.readLn() );
            Role re = rm.readRole( role );
            if ( re != null )
            {
                System.out.println( "ROLE OBJECT:" );
                System.out.println( "    name      [" + re.getName() + "]" );
                System.out.println( "    internalId  [" + re.getId() + "]" );
                System.out.println( "    description [" + re.getDescription() + "]" );
                System.out.println( "    parents [" + re.getParents() + "]" );
                printTemporal( re, "RBACROLE" );
            }
            else
            {
                System.out.println( "    name [" + role.getName() + "] was not found" );
            }
            System.out.println( "ENTER to continue" );
        }
        catch ( SecurityException e )
        {
            LOG.error( "readRole caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    void findRoles()
    {
        ReaderUtil.clearScreen();
        try
        {
            System.out.println( "" );
            System.out.println( "Enter value to search Roles with:" );
            String val = ReaderUtil.readLn();
            List<Role> list = rm.findRoles( val );
            if ( list != null && list.size() > 0 )
            {
                for ( int i = 0; i < list.size(); i++ )
                {
                    Role re = list.get( i );
                    System.out.println( "ROLE OBJECT [" + i + "]:" );
                    System.out.println( "    name      [" + re.getName() + "]" );
                    System.out.println( "    internalId  [" + re.getId() + "]" );
                    System.out.println( "    description [" + re.getDescription() + "]" );
                    System.out.println( "    parents [" + re.getParents() + "]" );
                    printTemporal( re, "RBACROLE" );
                }
            }
            else
            {
                System.out.println( "name [" + val + "] was not found" );
            }
            System.out.println( "ENTER to continue" );
        }
        catch ( SecurityException e )
        {
            LOG.error( "findRoles caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    /**
     * Description of the Method
     */
    protected void displaySessions()
    {
    }


    /**
     * Description of the Method
     */
    protected void displayUsers()
    {
        try
        {
            User ue;
            ArrayList list = ( ArrayList ) rm.findUsers( new User() );
            int size = list.size();

            for ( int i = 0; i < size; i++ )
            {
                ue = ( User ) list.get( i );
                System.out.println( "USER[" + i + "]" );
                System.out.println( "    userId      [" + ue.getUserId() + "]" );
                System.out.println( "    internalId  [" + ue.getInternalId() + "]" );
                System.out.println( "    description [" + ue.getDescription() + "]" );
                System.out.println( "    common name [" + ue.getCn() + "]" );
                System.out.println( "    surname     [" + ue.getSn() + "]" );
                System.out.println( "    orgUnitId   [" + ue.getOu() + "]" );
                System.out.println( "    pwpolicy    [" + ue.getPwPolicy() + "]" );
                printTemporal( ue, "USER" );
                printPosixAccount( ue, "POSIX" );
                printAddress( ue.getAddress(), "ADDRESS" );
                printPhone( ue.getPhones(), "PHONES" );
                printPhone( ue.getMobiles(), "MOBILES" );
                if ( ue.getRoles() != null )
                {
                    for ( UserRole ur : ue.getRoles() )
                    {
                        printTemporal( ur, "RBACROLE" );
                    }
                }
                if ( ue.getAdminRoles() != null )
                {
                    for ( UserAdminRole ur : ue.getAdminRoles() )
                    {
                        printAdminRole( ur );
                        printTemporal( ur, "ADMINROLE" );
                    }
                }
                System.out.println();
            }
            System.out.println( "ENTER to continue" );
        }
        catch ( SecurityException e )
        {
            LOG.error( "displayUsers caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    /**
     * Description of the Method
     */
    void findUsers()
    {
        String userVal;

        ReaderUtil.clearScreen();
        try
        {
            System.out.println( "Enter User Search Value" );
            userVal = ReaderUtil.readLn();
            User ue = new User();
            ue.setUserId( userVal );
            ArrayList list = ( ArrayList ) rm.findUsers( ue );
            int size = list.size();

            for ( int i = 0; i < size; i++ )
            {
                ue = ( User ) list.get( i );
                System.out.println( "USER[" + i + "]" );
                System.out.println( "    userId      [" + ue.getUserId() + "]" );
                System.out.println( "    internalId  [" + ue.getInternalId() + "]" );
                System.out.println( "    description [" + ue.getDescription() + "]" );
                System.out.println( "    common name [" + ue.getCn() + "]" );
                System.out.println( "    surname     [" + ue.getSn() + "]" );
                System.out.println( "    orgUnitId   [" + ue.getOu() + "]" );
                System.out.println( "    pwpolicy    [" + ue.getPwPolicy() + "]" );
                System.out.println( "    seqId       [" + ue.getSequenceId() + "]" );
                printTemporal( ue, "USER" );
                printPosixAccount( ue, "POSIX" );
                printAddress( ue.getAddress(), "ADDRESS" );
                printPhone( ue.getPhones(), "PHONES" );
                printPhone( ue.getMobiles(), "MOBILES" );
                if ( ue.getRoles() != null )
                {
                    for ( UserRole ur : ue.getRoles() )
                    {
                        printTemporal( ur, "RBACROLE" );
                    }
                }
                if ( ue.getAdminRoles() != null )
                {
                    for ( UserAdminRole ur : ue.getAdminRoles() )
                    {
                        printAdminRole( ur );
                        printTemporal( ur, "ADMINROLE" );
                    }
                }
                if ( ue.getProperties() != null && ue.getProperties().size() > 0 )
                {
                    int ctr = 0;
                    for ( Enumeration e = ue.getProperties().propertyNames(); e.hasMoreElements(); )
                    {
                        String key = ( String ) e.nextElement();
                        String val = ue.getProperty( key );
                        System.out.println( "prop key[" + ctr + "]=" + key );
                        System.out.println( "prop value[" + ctr++ + "]=" + val );
                    }
                }

                System.out.println();
            }
            System.out.println( "ENTER to continue" );
        }
        catch ( SecurityException e )
        {
            LOG.error( "findUsers caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    void getUser()
    {
        String userVal;
        ReaderUtil.clearScreen();
        try
        {
            System.out.println( "Enter Internal id for user:" );
            userVal = ReaderUtil.readLn();
            User ue = new User();
            ue.setInternalId( userVal );
            ArrayList list = ( ArrayList ) rm.findUsers( ue );
            int size = list.size();
            for ( int i = 0; i < size; i++ )
            {
                ue = ( User ) list.get( i );
                System.out.println( "USER[" + i + "]" );
                System.out.println( "    userId      [" + ue.getUserId() + "]" );
                System.out.println( "    internalId  [" + ue.getInternalId() + "]" );
                System.out.println( "    description [" + ue.getDescription() + "]" );
                System.out.println( "    common name [" + ue.getCn() + "]" );
                System.out.println( "    surname     [" + ue.getSn() + "]" );
                System.out.println( "    orgUnitId   [" + ue.getOu() + "]" );
                System.out.println( "    pwpolicy    [" + ue.getPwPolicy() + "]" );
                printTemporal( ue, "USER" );
                printPosixAccount( ue, "POSIX" );
                printAddress( ue.getAddress(), "ADDRESS" );
                printPhone( ue.getPhones(), "PHONES" );
                printPhone( ue.getMobiles(), "MOBILES" );
                if ( ue.getRoles() != null )
                {
                    for ( UserRole ur : ue.getRoles() )
                    {
                        printTemporal( ur, "RBACROLE" );
                    }
                }
                if ( ue.getAdminRoles() != null )
                {
                    for ( UserAdminRole ur : ue.getAdminRoles() )
                    {
                        printAdminRole( ur );
                        printTemporal( ur, "ADMINROLE" );
                    }
                }
                if ( ue.getProperties() != null && ue.getProperties().size() > 0 )
                {
                    int ctr = 0;
                    for ( Enumeration e = ue.getProperties().propertyNames(); e.hasMoreElements(); )
                    {
                        String key = ( String ) e.nextElement();
                        String val = ue.getProperty( key );
                        System.out.println( "prop key[" + ctr + "]=" + key );
                        System.out.println( "prop value[" + ctr++ + "]=" + val );
                    }
                }

                System.out.println();
            }
            System.out.println( "ENTER to continue" );
        }
        catch ( SecurityException e )
        {
            LOG.error( "getUser caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    /**
     *
     */
    void findUsersByOrg()
    {
        String szOu;

        ReaderUtil.clearScreen();
        try
        {
            System.out.println( "Enter OrgUnit name" );
            szOu = ReaderUtil.readLn();
            OrgUnit ou = new OrgUnit( szOu );
            ou.setType( OrgUnit.Type.USER );
            List<User> list = rm.findUsers( ou );
            int ctr = 0;
            for ( User ue : list )
            {
                System.out.println( "USER[" + ++ctr + "]" );
                System.out.println( "    userId      [" + ue.getUserId() + "]" );
                System.out.println( "    internalId  [" + ue.getInternalId() + "]" );
                System.out.println( "    description [" + ue.getDescription() + "]" );
                System.out.println( "    common name [" + ue.getCn() + "]" );
                System.out.println( "    surname     [" + ue.getSn() + "]" );
                System.out.println( "    orgUnitId   [" + ue.getOu() + "]" );
                System.out.println( "    pwpolicy    [" + ue.getPwPolicy() + "]" );
                printTemporal( ue, "USER" );
                printAddress( ue.getAddress(), "ADDRESS" );
                printPhone( ue.getPhones(), "PHONES" );
                printPhone( ue.getMobiles(), "MOBILES" );
                if ( ue.getRoles() != null )
                {
                    for ( UserRole ur : ue.getRoles() )
                    {
                        printTemporal( ur, "RBACROLE" );
                    }
                }
                if ( ue.getAdminRoles() != null )
                {
                    for ( UserAdminRole ur : ue.getAdminRoles() )
                    {
                        printAdminRole( ur );
                        printTemporal( ur, "ADMINROLE" );
                    }
                }
                if ( ue.getProperties() != null && ue.getProperties().size() > 0 )
                {
                    int pctr = 0;
                    for ( Enumeration e = ue.getProperties().propertyNames(); e.hasMoreElements(); )
                    {
                        String key = ( String ) e.nextElement();
                        String val = ue.getProperty( key );
                        System.out.println( "prop key[" + pctr + "]=" + key );
                        System.out.println( "prop value[" + pctr++ + "]=" + val );
                    }
                }

                System.out.println();
            }
            System.out.println( "ENTER to continue" );
        }
        catch ( SecurityException e )
        {
            LOG.error( "findUsersByOrg caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    /**
      *
      */
    void assignedRoles()
    {
        ReaderUtil.clearScreen();
        try
        {
            System.out.println( "Enter UserId:" );
            User user = new User();
            user.setUserId( ReaderUtil.readLn() );
            List<UserRole> userRoles = rm.assignedRoles( user );
            if ( userRoles != null )
            {
                for ( UserRole userRole : userRoles )
                {
                    System.out.println( "ROLE OBJECT:" );
                    System.out.println( "    name      [" + userRole.getName() + "]" );
                    printTemporal( userRole, "RBACROLE" );
                }

            }
            else
            {
                System.out.println( "    userId [" + user.getUserId() + "] has no roles" );
            }
            System.out.println( "ENTER to continue" );
        }
        catch ( SecurityException e )
        {
            LOG.error( "assignedRoles caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    static void printTemporal( Constraint constraint, String label )
    {
        if ( constraint != null )
        {
            System.out.println( "    " + label + "[" + constraint.getName() + "]:" );
            System.out.println( "        begin time [" + constraint.getBeginTime() + "]" );
            System.out.println( "        end time [" + constraint.getEndTime() + "]" );
            System.out.println( "        begin date [" + constraint.getBeginDate() + "]" );
            System.out.println( "        end date [" + constraint.getEndDate() + "]" );
            System.out.println( "        begin lock [" + constraint.getBeginLockDate() + "]" );
            System.out.println( "        end lock [" + constraint.getEndLockDate() + "]" );
            System.out.println( "        day mask [" + constraint.getDayMask() + "]" );
            System.out.println( "        time out [" + constraint.getTimeout() + "]" );
        }
    }


    static void printPosixAccount( User user, String label )
    {
        if ( user != null )
        {
            System.out.println( "    " + label + ":" );
            System.out.println( "        uid number  [" + user.getUidNumber() + "]" );
            System.out.println( "        gid number  [" + user.getGidNumber() + "]" );
            System.out.println( "        home dir    [" + user.getHomeDirectory() + "]" );
            System.out.println( "        login shell [" + user.getLoginShell() + "]" );
            System.out.println( "        gecos       [" + user.getGecos() + "]" );
        }
    }


    private static void printAddress( Address address, String label )
    {
        if ( address != null )
        {
            System.out.println( label );
            if ( CollectionUtils.isNotEmpty( address.getAddresses() ) )
            {
                for ( String addr : address.getAddresses() )
                {
                    System.out.println( "    line        [" + addr + "]" );
                }
            }
            System.out.println( "    city        [" + address.getCity() + "]" );
            System.out.println( "    state       [" + address.getState() + "]" );
            System.out.println( "    zip         [" + address.getPostalCode() + "]" );
        }
    }


    private static void printPhone( List<String> phones, String label )
    {
        if ( phones != null )
        {
            System.out.println( label );
            for ( String phone : phones )
            {
                System.out.println( "    number      [" + phone + "]" );
            }
        }
    }


    private static void printAdminRole( UserAdminRole ur )
    {
        if ( ur != null )
        {
            System.out.println( "    ADMINATTR UID[" + ur.getUserId() + "]:" );
            System.out.println( "        begin range [" + ur.getBeginRange() + "]" );
            System.out.println( "        end range [" + ur.getEndRange() + "]" );
            System.out.println( "        OsP [" + ur.getOsPSet() + "]" );
            System.out.println( "        OsU [" + ur.getOsUSet() + "]" );
        }
    }


    /**
     * Description of the Method
     */
    void readUser()
    {
        String userId;

        ReaderUtil.clearScreen();
        try
        {
            System.out.println( "Enter UserId to read:" );
            userId = ReaderUtil.readLn();
            User user = new User();
            user.setUserId( userId );
            User ue = rm.readUser( user );
            if ( ue != null )
            {
                System.out.println( "USER OBJECT:" );
                System.out.println( "    userId      [" + ue.getUserId() + "]" );
                System.out.println( "    internalId  [" + ue.getInternalId() + "]" );
                System.out.println( "    description [" + ue.getDescription() + "]" );
                System.out.println( "    common name [" + ue.getCn() + "]" );
                System.out.println( "    surname     [" + ue.getSn() + "]" );
                System.out.println( "    orgUnitId   [" + ue.getOu() + "]" );
                System.out.println( "    pwpolicy    [" + ue.getPwPolicy() + "]" );
                printPosixAccount( ue, "POSIX" );
                printTemporal( ue, "USER" );
                if ( ue.getRoles() != null )
                {
                    for ( UserRole ur : ue.getRoles() )
                    {
                        printTemporal( ur, "RBACROLE" );
                    }
                }
                if ( ue.getAdminRoles() != null )
                {
                    for ( UserAdminRole ur : ue.getAdminRoles() )
                    {
                        printAdminRole( ur );
                        printTemporal( ur, "ADMINROLE" );
                    }
                }
                if ( ue.getProperties() != null && ue.getProperties().size() > 0 )
                {
                    int ctr = 0;
                    for ( Enumeration e = ue.getProperties().propertyNames(); e.hasMoreElements(); )
                    {
                        String key = ( String ) e.nextElement();
                        String val = ue.getProperty( key );
                        System.out.println( "prop key[" + ctr + "]=" + key );
                        System.out.println( "prop value[" + ctr++ + "]=" + val );
                    }
                }
            }
            else
            {
                System.out.println( "    user [" + userId + "] was not found" );
            }
            System.out.println( "ENTER to continue" );
        }
        catch ( SecurityException e )
        {
            LOG.error( "readUser caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    /**
     * Description of the Method
     */
    void searchPermissions()
    {
        Permission pe;
        /*
           *  This is the Fortress Logical Data Model for Perm:
           *  public class Perm
           *  implements java.io.Serializable
           *  {
           *  public void setInternalId()
           *  public void setInternalId(String internalId)
           *  public String getInternalId()
           *  public void setName(String name)
           *  public String getName()
           *  public void setDescription(String description)
           *  public String getDescription()
           *  public void addRole(String name)
           *  public List getRoles()
           *  public void addRoles(ArrayList roles)
           *  public void addUser(String user)
           *  public List getUsers()
           *  public void addUsers(ArrayList users)
           *  public void addGroup(String group)
           *  public List getGroups()
           *  public void addGroups(ArrayList groups)
           *  public void addProperty(String key, String value)
           *  public void addProperties(Properties props)
           *  public Properties getProperties()
           *  public String getProperty(String key)
           *  public void setOu(String ou)
           *  public String getOu()
           *  public void setType(String type)
           *  public String getType()
           *  public void setDn(String dn)
           *  public String getDn()
           *  public void addFinePerm(FinePerm fPerm)
           *  public HashMap getFinePerms()
           *  public void addFinePerms(HashMap fPerms)
           *  }
           *  public class FinePerm
           *  implements java.io.Serializable
           *  {
           *  public String getObjName()
           *  public void setObjName(String objName)
           *  public void addRole(String name)
           *  public List getRoles()
           *  public void addUser(String user)
           *  public List getUsers()
           *  public void addGroup(String group)
           *  public List getGroups()
           *  }
           */
        try
        {
            //ReaderUtil.clearScreen();
            //System.out.println("Enter operationid");

            System.out.println( "Enter object name:" );
            String name = ReaderUtil.readLn();
            System.out.println( "Enter op name:" );
            String opname = ReaderUtil.readLn();
            pe = new Permission();
            pe.setObjName( name );
            pe.setOpName( opname );
            List list = rm.findPermissions( pe );
            if ( list != null )
            {
                for ( int i = 0; i < list.size(); i++ )
                {
                    pe = ( Permission ) list.get( i );
                    System.out.println( "**perm:" + ( i + 1 ) + "***" );
                    //System.out.println("perm operation [" + pe.operation + "]");
                    System.out.println( "object name [" + pe.getObjName() + "]" );
                    System.out.println( "object id [" + pe.getObjId() + "]" );
                    System.out.println( "operation name [" + pe.getOpName() + "]" );
                    System.out.println( "abstract perm name [" + pe.getAbstractName() + "]" );
                    System.out.println( "internalId [" + pe.getInternalId() + "]" );
                    if ( pe.getUsers() != null && pe.getUsers().size() > 0 )
                    {
                        int ctr = 0;
                        for ( String user : pe.getUsers() )
                        {
                            System.out.println( "user[" + ctr++ + "]=" + user );
                        }
                    }
                    if ( pe.getRoles() != null && pe.getRoles().size() > 0 )
                    {
                        int ctr = 0;
                        for ( String role : pe.getRoles() )
                        {
                            System.out.println( "name[" + ctr++ + "]=" + role );
                        }
                    }
                    if ( pe.getProperties() != null && pe.getProperties().size() > 0 )
                    {
                        int ctr = 0;
                        for ( Enumeration e = pe.getProperties().propertyNames(); e.hasMoreElements(); )
                        {
                            String key = ( String ) e.nextElement();
                            String val = pe.getProperty( key );
                            System.out.println( "prop key[" + ctr + "]=" + key );
                            System.out.println( "prop value[" + ctr++ + "]=" + val );
                        }
                    }

                    //prettyPrintFinePermissions(pe.getFinePerms());
                    System.out.println( "**" );
                }
                System.out.println( "search complete" );
                System.out.println( "ENTER to continue" );
            }
        }
        catch ( SecurityException e )
        {
            LOG.error( "searchPermissions caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    /**
     *  Description of the Method
     *
     *@param  pmap  Description of the Parameter
     */
    /*    private final void prettyPrintFinePermissions(Map pmap)
        {
            if (pmap != null)
            {
                Set pset = pmap.keySet();
                Iterator piter = pset.iterator();
                while (piter.hasNext())
                {
                    FinePerm perm = (FinePerm) pmap.get(piter.next());
                    System.out.println("Fine Perm objectname:" + perm.getObjName());
                    if (perm.getRoles() != null && perm.getRoles().size() > 0)
                    {
                        List roles = perm.getRoles();
                        for (int i = 0; i < roles.size(); i++)
                        {
                            String name = (String) roles.get(i);
                            System.out.println("Fine Perm name: " + name);
                        }
                    }
                    if (perm.getUsers() != null && perm.getUsers().size() > 0)
                    {
                        List users = perm.getUsers();
                        for (int i = 0; i < users.size(); i++)
                        {
                            String user = (String) users.get(i);
                            System.out.println("Fine Perm user: " + user);
                        }
                    }
                    if (perm.getGroups() != null && perm.getGroups().size() > 0)
                    {
                        List groups = perm.getGroups();
                        for (int i = 0; i < groups.size(); i++)
                        {
                            String group = (String) groups.get(i);
                            System.out.println("Fine Perm group: " + group);
                        }
                    }
                }
            }
        }
        */

    /**
     * Description of the Method
     */
    void readPermission()
    {
        Permission pe;
        try
        {
            Permission permission = new Permission();
            ReaderUtil.clearScreen();

            System.out.println( "Enter perm object name:" );
            String name = ReaderUtil.readLn();
            permission.setObjName( name );
            System.out.println( "Enter perm object id or null for none:" );
            String oid = ReaderUtil.readLn();
            permission.setObjId( oid );
            System.out.println( "Enter perm operation name:" );
            String op = ReaderUtil.readLn();
            permission.setOpName( op );
            pe = rm.readPermission( permission );
            if ( pe != null )
            {
                //System.out.println("perm operation [" + pe.operation + "]");
                System.out.println( "object name [" + pe.getObjName() + "]" );
                System.out.println( "object id [" + pe.getObjId() + "]" );
                System.out.println( "operation name [" + pe.getOpName() + "]" );
                System.out.println( "abstract perm name [" + pe.getAbstractName() + "]" );
                System.out.println( "internalId [" + pe.getInternalId() + "]" );
                if ( pe.getUsers() != null && pe.getUsers().size() > 0 )
                {
                    int ctr = 0;
                    for ( String user : pe.getUsers() )
                    {
                        System.out.println( "user[" + ctr++ + "]=" + user );
                    }
                }
                if ( pe.getRoles() != null && pe.getRoles().size() > 0 )
                {
                    int ctr = 0;
                    for ( String role : pe.getRoles() )
                    {
                        System.out.println( "name[" + ctr++ + "]=" + role );
                    }
                }
                if ( pe.getProperties() != null && pe.getProperties().size() > 0 )
                {
                    int ctr = 0;
                    for ( Enumeration e = pe.getProperties().propertyNames(); e.hasMoreElements(); )
                    {
                        String key = ( String ) e.nextElement();
                        String val = pe.getProperty( key );
                        System.out.println( "prop key[" + ctr + "]=" + key );
                        System.out.println( "prop value[" + ctr++ + "]=" + val );
                    }
                }
                System.out.println( "**" );
                System.out.println( "read operation complete" );
                System.out.println( "ENTER to continue" );
            }
        }
        catch ( SecurityException e )
        {
            LOG.error( "readPermission caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    /**
     * Description of the Method
     */
    void permissionRoles()
    {
        Permission pe;
        try
        {
            Permission permission = new Permission();
            ReaderUtil.clearScreen();

            System.out.println( "Enter perm object name:" );
            String name = ReaderUtil.readLn();
            permission.setObjName( name );
            System.out.println( "Enter perm object id or null for none:" );
            String oid = ReaderUtil.readLn();
            permission.setObjId( oid );
            System.out.println( "Enter perm operation name:" );
            String op = ReaderUtil.readLn();
            permission.setOpName( op );
            pe = rm.readPermission( permission );
            if ( pe != null )
            {
                //System.out.println("perm operation [" + pe.operation + "]");
                System.out.println( "object name [" + pe.getObjName() + "]" );
                System.out.println( "object id [" + pe.getObjId() + "]" );
                System.out.println( "operation name [" + pe.getOpName() + "]" );
                System.out.println( "abstract perm name [" + pe.getAbstractName() + "]" );
                System.out.println( "internalId [" + pe.getInternalId() + "]" );
                if ( pe.getRoles() != null && pe.getRoles().size() > 0 )
                {
                    int ctr = 0;
                    for ( String role : pe.getRoles() )
                    {
                        System.out.println( "name[" + ctr++ + "]=" + role );
                    }
                }
                System.out.println( "**" );
                System.out.println( "read operation complete" );
                System.out.println( "ENTER to continue" );
            }
        }
        catch ( SecurityException e )
        {
            LOG.error( "permissionRoles caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    void permissionUsers()
    {
        Permission pe;
        try
        {
            Permission permission = new Permission();
            ReaderUtil.clearScreen();

            System.out.println( "Enter perm object name:" );
            String name = ReaderUtil.readLn();
            permission.setObjName( name );
            System.out.println( "Enter perm object id or null for none:" );
            String oid = ReaderUtil.readLn();
            permission.setObjId( oid );
            System.out.println( "Enter perm operation name:" );
            String op = ReaderUtil.readLn();
            permission.setOpName( op );
            pe = rm.readPermission( permission );
            if ( pe != null )
            {
                //System.out.println("perm operation [" + pe.operation + "]");
                System.out.println( "object name [" + pe.getObjName() + "]" );
                System.out.println( "object id [" + pe.getObjId() + "]" );
                System.out.println( "operation name [" + pe.getOpName() + "]" );
                System.out.println( "abstract perm name [" + pe.getAbstractName() + "]" );
                System.out.println( "internalId [" + pe.getInternalId() + "]" );
                if ( pe.getUsers() != null && pe.getUsers().size() > 0 )
                {
                    int ctr = 0;
                    for ( String user : pe.getUsers() )
                    {
                        System.out.println( "user[" + ctr++ + "]=" + user );
                    }
                }
                System.out.println( "**" );
                System.out.println( "read operation complete" );
                System.out.println( "ENTER to continue" );
            }
        }
        catch ( SecurityException e )
        {
            LOG.error( "permissionUsers caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    /**
     *
     */
    void authorizedUsers()
    {
        try
        {
            System.out.println( "Enter role name:" );
            String name = ReaderUtil.readLn();
            User ue;
            ArrayList list = ( ArrayList ) rm.authorizedUsers( new Role( name ) );
            int size = list.size();

            for ( int i = 0; i < size; i++ )
            {
                ue = ( User ) list.get( i );
                System.out.println( "USER[" + i + "]" );
                System.out.println( "    userId      [" + ue.getUserId() + "]" );
                System.out.println( "    internalId  [" + ue.getInternalId() + "]" );
                System.out.println( "    description [" + ue.getDescription() + "]" );
                System.out.println( "    common name [" + ue.getCn() + "]" );
                System.out.println( "    surname     [" + ue.getSn() + "]" );
                System.out.println( "    orgUnitId   [" + ue.getOu() + "]" );
                printTemporal( ue, "USER" );
                printPosixAccount( ue, "POSIX" );
                System.out.println();
            }
            System.out.println( "ENTER to continue" );
        }
        catch ( SecurityException e )
        {
            LOG.error( "authorizedUsers caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }


    /**
     *
     */
    void rolePermissions()
    {
        try
        {
            System.out.println( "Enter role name:" );
            String name = ReaderUtil.readLn();
            List<Permission> list = rm.rolePermissions( new Role( name ) );
            if ( list != null )
            {
                int ctr = 0;
                for ( Permission pe : list )
                {
                    System.out.println( "**perm:" + ( ++ctr ) + "***" );
                    //System.out.println("perm operation [" + pe.operation + "]");
                    System.out.println( "object name [" + pe.getObjName() + "]" );
                    System.out.println( "object id [" + pe.getObjId() + "]" );
                    System.out.println( "operation name [" + pe.getOpName() + "]" );
                    System.out.println( "abstract perm name [" + pe.getAbstractName() + "]" );
                    System.out.println( "internalId [" + pe.getInternalId() + "]" );
                    if ( pe.getUsers() != null && pe.getUsers().size() > 0 )
                    {
                        int ctr2 = 0;
                        for ( String user : pe.getUsers() )
                        {
                            System.out.println( "user[" + ctr2++ + "]=" + user );
                        }
                    }
                    if ( pe.getRoles() != null && pe.getRoles().size() > 0 )
                    {
                        int ctr2 = 0;
                        for ( String role : pe.getRoles() )
                        {
                            System.out.println( "name[" + ctr2++ + "]=" + role );
                        }
                    }
                    if ( pe.getProperties() != null && pe.getProperties().size() > 0 )
                    {
                        int pctr = 0;
                        for ( Enumeration e = pe.getProperties().propertyNames(); e.hasMoreElements(); )
                        {
                            String key = ( String ) e.nextElement();
                            String val = pe.getProperty( key );
                            System.out.println( "prop key[" + pctr + "]=" + key );
                            System.out.println( "prop value[" + pctr++ + "]=" + val );
                        }
                    }

                    //prettyPrintFinePermissions(pe.getFinePerms());
                    System.out.println( "**" );
                }
                System.out.println( "search complete" );
                System.out.println( "ENTER to continue" );
            }
        }
        catch ( SecurityException e )
        {
            LOG.error( "rolePermissions caught SecurityException rc=" + e.getErrorId() + ", msg=" + e.getMessage(), e );
        }
        ReaderUtil.readChar();
    }

}