All Downloads are FREE. Search and download functionalities are using the official Maven repository.

src.com.ibm.as400.access.DirectoryEntryList Maven / Gradle / Ivy

There is a newer version: 11.1
Show newest version
///////////////////////////////////////////////////////////////////////////////
//                                                                             
// JTOpen (IBM Toolbox for Java - OSS version)                              
//                                                                             
// Filename: DirectoryEntryList.java
//                                                                             
// The source code contained herein is licensed under the IBM Public License   
// Version 1.0, which has been approved by the Open Source Initiative.         
// Copyright (C) 1997-2003 International Business Machines Corporation and     
// others. All rights reserved.                                                
//                                                                             
///////////////////////////////////////////////////////////////////////////////

package com.ibm.as400.access;

import java.beans.PropertyVetoException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;

/**
 * Retrieves a list of system distribution directory entries.
 * 

* By default, all entries are returned as if by calling addSelection(DirectoryEntryList.USER_PROFILE, "*"). * *

 * AS400 system = new AS400();
 * DirectoryEntryList list = new DirectoryEntryList(system);
 * // Retrieves all of the entries that map to user profiles that begin with the letter 'B'.
 * list.addSelection(DirectoryEntryList.USER_PROFILE, "B*");
 * DirectoryEntry[] entries = list.getEntries();
 * 
*

* Here is an example of using selection IDs: *

 * AS400 system = new AS400();
 * DirectoryEntryList list = new DirectoryEntryList(system);
 * list.addSelection(DirectoryEntryList.LAST_NAME, "SMITH");
 * list.addSelection(DirectoryEntryList.FIRST_NAME, "C*");
 * list.setKey(DirectoryEntryList.FIRST_NAME); // Set the primary sort to be the first name field.
 * DirectoryEntry[] entries = list.getEntries();
 * 
* * @see com.ibm.as400.access.DirectoryEntry * @see com.ibm.as400.access.User **/ public class DirectoryEntryList { private static final ProgramParameter errorCode_ = new ProgramParameter(new byte[4]); private AS400 system_; private String keyValue_ = null; private final Hashtable selectionValues_ = new Hashtable(); /** * Constant used to filter the list of directory entries by mailing address. * @see com.ibm.as400.access.DirectoryEntry#getMailingAddress1 **/ public static final String ADDRESS1 = "ADDR1"; /** * Constant used to filter the list of directory entries by mailing address. * @see com.ibm.as400.access.DirectoryEntry#getMailingAddress2 **/ public static final String ADDRESS2 = "ADDR2"; /** * Constant used to filter the list of directory entries by mailing address. * @see com.ibm.as400.access.DirectoryEntry#getMailingAddress3 **/ public static final String ADDRESS3 = "ADDR3"; /** * Constant used to filter the list of directory entries by mailing address. * @see com.ibm.as400.access.DirectoryEntry#getMailingAddress4 **/ public static final String ADDRESS4 = "ADDR4"; /** * Constant used to filter the list of directory entries by building. * @see com.ibm.as400.access.DirectoryEntry#getBuilding **/ public static final String BUILDING = "BLDG"; /** * Constant used to filter the list of directory entries by company. * @see com.ibm.as400.access.DirectoryEntry#getCompany **/ public static final String COMPANY = "CMPNY"; /** * Constant used to filter the list of directory entries by department. * @see com.ibm.as400.access.DirectoryEntry#getDepartment **/ public static final String DEPARTMENT = "DEPT"; /** * Constant used to filter the list of directory entries by fax number. * @see com.ibm.as400.access.DirectoryEntry#getFaxNumber **/ public static final String FAX = "FAXTELNBR"; /** * Constant used to filter the list of directory entries by first name. * @see com.ibm.as400.access.DirectoryEntry#getFirstName **/ public static final String FIRST_NAME = "FSTNAM"; /** * Constant used to filter the list of directory entries by first or preferred name. * This constant is only used as input to filter the list. Its value cannot be * retrieved from a DirectoryEntry object. **/ public static final String FIRST_OR_PREFERRED_NAME = "FSTPREFNAM"; /** * Constant used to filter the list of directory entries by full name. * @see com.ibm.as400.access.DirectoryEntry#getFullName **/ public static final String FULL_NAME = "FULNAM"; /** * Constant used to filter the list of directory entries by job title. * @see com.ibm.as400.access.DirectoryEntry#getJobTitle **/ public static final String JOB_TITLE = "TITLE"; /** * Constant used to filter the list of directory entries by last name. * @see com.ibm.as400.access.DirectoryEntry#getLastName **/ public static final String LAST_NAME = "LSTNAM"; /** * Constant used to filter the list of directory entries by location. * @see com.ibm.as400.access.DirectoryEntry#getLocation **/ public static final String LOCATION = "LOC"; /** * Constant used to filter the list of directory entries by middle name. * @see com.ibm.as400.access.DirectoryEntry#getMiddleName **/ public static final String MIDDLE_NAME = "MIDNAM"; /** * Constant used to filter the list of directory entries by network user ID. * @see com.ibm.as400.access.DirectoryEntry#getNetworkUserID **/ public static final String NETWORK_USER_ID = "NETUSRID"; /** * Constant used to filter the list of directory entries by office. * @see com.ibm.as400.access.DirectoryEntry#getOffice **/ public static final String OFFICE = "OFC"; /** * Constant used to filter the list of directory entries by preferred name. * @see com.ibm.as400.access.DirectoryEntry#getPreferredName **/ public static final String PREFERRED_NAME = "PREFNAM"; /** * Constant used to filter the list of directory entries by system group. * @see com.ibm.as400.access.DirectoryEntry#getSystemGroup **/ public static final String SYSTEM_GROUP = "SYSGRP"; /** * Constant used to filter the list of directory entries by system name. * @see com.ibm.as400.access.DirectoryEntry#getSystemName **/ public static final String SYSTEM_NAME = "SYSNAME"; /** * Constant used to filter the list of directory entries by telephone number. * @see com.ibm.as400.access.DirectoryEntry#getTelephoneNumber1 **/ public static final String TELEPHONE1 = "TELNBR1"; /** * Constant used to filter the list of directory entries by telephone number. * @see com.ibm.as400.access.DirectoryEntry#getTelephoneNumber2 **/ public static final String TELEPHONE2 = "TELNBR2"; /** * Constant used to filter the list of directory entries by text description. * @see com.ibm.as400.access.DirectoryEntry#getText **/ public static final String TEXT = "TEXT"; /** * Constant used to filter the list of directory entries by directory entry user address. * @see com.ibm.as400.access.DirectoryEntry#getUserAddress **/ public static final String USER_ADDRESS = "USRADDR"; /** * Constant used to filter the list of directory entries by user description. * @see com.ibm.as400.access.DirectoryEntry#getUserDescription **/ public static final String USER_DESCRIPTION = "USRD"; /** * Constant used to filter the list of directory entries by directory entry user ID. * @see com.ibm.as400.access.DirectoryEntry#getUserID **/ public static final String USER_ID = "USRID"; /** * Constant used to filter the list of directory entries by user profile name. * @see com.ibm.as400.access.DirectoryEntry#getUserProfile **/ public static final String USER_PROFILE = "USER"; /** * Constructs a DirectoryEntryList. * By default, no selection IDs have been added. You must add at least one selection ID in order * to retrieve any directory entries. The most common way to retrieve a list of all entries on * the system is to add a selection for USER_PROFILE with a value of "*". * @param system The system. **/ public DirectoryEntryList(AS400 system) { if (system == null) throw new NullPointerException("system"); system_ = system; } /** * Adds a value used to filter the list of directory entries returned by {@link #getEntries getEntries()}. * See the list of constants in this class for some possible selection IDs. Other selection IDs * can be used, if they are allowed by the QOKSCHD system API. * If the specified selectionID has already been added, then the specified value will override * the previously added value. * @param selectionID The selectionID, e.g. {@link #LAST_NAME LAST_NAME} or {@link #USER_PROFILE USER_PROFILE}. * @param value The value used as the filter for the specified selectionID, e.g. "SMITH" or "A*". * The asterisk '*' is allowed as a wildcard character. * @see #clearSelection * @see #setKey **/ public void addSelection(String selectionID, String value) { if (selectionID == null) throw new NullPointerException("selectionID"); if (value == null) throw new NullPointerException("value"); if (selectionValues_.isEmpty()) { keyValue_ = selectionID; } selectionValues_.put(selectionID, value); } /** * Removes all selection IDs and values that were previously added by {@link #addSelection addSelection()}. * This also clears the key. * @see #addSelection * @see #setKey **/ public void clearSelection() { selectionValues_.clear(); keyValue_ = null; } /** * Retrieves the directory entry information from the system. * This method internally calls the following system API: QOKSCHD * @return An array of directory entries. * @throws AS400Exception If an error occurs. * @throws AS400SecurityException If a security or authority error occurs. * @throws ErrorCompletingRequestException If an error occurs before the request is completed. * @throws InterruptedException If this thread is interrupted. * @throws IOException If an error occurs while communicating with the system. * @throws ObjectDoesNotExistException If the object does not exist. **/ public DirectoryEntry[] getEntries() throws AS400Exception, AS400SecurityException, ErrorCompletingRequestException, InterruptedException, IOException, ObjectDoesNotExistException { if (system_ == null) throw new ExtendedIllegalStateException("system", ExtendedIllegalStateException.PROPERTY_NOT_SET); if (selectionValues_.isEmpty()) addSelection(USER_PROFILE, "*"); // The default. ProgramParameter[] parms = new ProgramParameter[9]; int bufferSize = 33+636*20; final int ccsid = system_.getCcsid(); final ConvTable conv = ConvTable.getTable(ccsid, null); final AS400Text text10 = new AS400Text(10, ccsid); parms[0] = new ProgramParameter(bufferSize); // receiver variable parms[1] = new ProgramParameter(BinaryConverter.intToByteArray(bufferSize)); // length of receiver variable parms[2] = new ProgramParameter(conv.stringToByteArray("SRCV0100")); // format name of receiver variable parms[3] = new ProgramParameter(text10.toBytes("*SEARCH")); // function parms[4] = new ProgramParameter(new byte[] { (byte)0xF0 }); // '0' to not keep temporary resources, otherwise we'd have to call it with *CLEANUP // First, calculate the amount of selection bytes. int numValues = selectionValues_.size(); Enumeration list = selectionValues_.keys(); int totalSelectionLength = 0; while (list.hasMoreElements()) { String selectionID = (String)list.nextElement(); String val = (String)selectionValues_.get(selectionID); totalSelectionLength += val.length(); } byte[] request = new byte[130+(numValues*28)+totalSelectionLength]; // CCSID of data input = 0 (default to job CCSID) // character set of data input (ignored unless CCSID is -1) // code page of data input (ignored unless CCSID is -1) conv.stringToByteArray("* ", request, 12, 4); // wildcard character (blank means no wildcard searches) request[16] = (byte)0xF1; // convert receiver data ('1' = convert it to CCSID specified) request[17] = (byte)0xF0; // data to search ('0' = only search local data, not shadowed data) request[18] = (byte)0xF1; // run verify ('1' = verify the input parameters are valid) request[19] = (byte)0xF0; // continuation handle ('0' for the first search) conv.stringToByteArray(" ", request, 20, 16); // resource handle (blank for the first search) conv.stringToByteArray("SREQ0101", request, 36, 8); // format name of the search request array BinaryConverter.intToByteArray(130, request, 44); // offset to search request array BinaryConverter.intToByteArray(numValues, request, 48); // number of elements in search request array conv.stringToByteArray("SREQ0103", request, 52, 8); // format name of array of fields to return BinaryConverter.intToByteArray(100, request, 60); // offset to array of fields to return BinaryConverter.intToByteArray(3, request, 64); // number of elements in fields to return array conv.stringToByteArray("SRCV0101", request, 68, 8); // format name of array of users to return BinaryConverter.intToByteArray(0xFFFF, request, 76); // number of elements in array of users. Note: Fix this so we can chain. conv.stringToByteArray("SRCV0112", request, 80, 8); // format name of array of fields for each user conv.stringToByteArray(" ", request, 88, 8); // format name of the order of field names to return (blanks = order is not returned) request[96] = (byte)0xF0; // return fields in order specified ('0' = return fields in the predefined order) conv.stringToByteArray(" ", request, 97, 3); // reserved // Array of fields to return: text10.toBytes("*SYSDIR", request, 100); // special value of fields to be returned (SREQ0103) text10.toBytes("*SMTP", request, 110); text10.toBytes("*ORNAME", request, 120); // Search request array: int offset = 130; // Do the key first, then the rest of the selection criteria. if (keyValue_ != null) { String selectionID = keyValue_; String val = (String)selectionValues_.remove(selectionID); int len = val.length(); BinaryConverter.intToByteArray(28+len, request, offset); request[offset+4] = (byte)0xF1; text10.toBytes(selectionID, request, offset+5); conv.stringToByteArray("*IBM ", request, offset+15, 7); request[offset+22] = 0x40; request[offset+23] = 0x40; BinaryConverter.intToByteArray(len, request, offset+24); AS400Text textConv = new AS400Text(len, ccsid); textConv.toBytes(val, request, offset+28); offset += 28+len; } // Do the rest of the selection criteria. list = selectionValues_.keys(); while (list.hasMoreElements()) { String selectionID = (String)list.nextElement(); String val = (String)selectionValues_.get(selectionID); int len = val.length(); BinaryConverter.intToByteArray(28+len, request, offset); // SREQ0101 - length of entry request[offset+4] = (byte)0xF1; // SREQ0101 - compare value ('1' means 'equal') text10.toBytes(selectionID, request, offset+5); // SREQ0101 - field name conv.stringToByteArray("*IBM ", request, offset+15, 7); // SREQ0101 - product ID request[offset+22] = 0x40; // SREQ0101 - case of data input (blank means case insensitive search except for SMTPUSRID and SMTPRTE fields) request[offset+23] = 0x40; // reserved BinaryConverter.intToByteArray(len, request, offset+24); // SREQ0101 - length of value AS400Text textConv = new AS400Text(len, ccsid); textConv.toBytes(val, request, offset+28); // SREQ0101 - value to match (blank means ignore) offset += 28+len; } parms[5] = new ProgramParameter(request); // request variable parms[6] = new ProgramParameter(BinaryConverter.intToByteArray(request.length)); // length of request variable parms[7] = new ProgramParameter(conv.stringToByteArray("SREQ0100")); // format name of request variable parms[8] = errorCode_; ProgramCall pc = new ProgramCall(system_, "/QSYS.LIB/QOKSCHD.PGM", parms); if (!pc.run()) { throw new AS400Exception(pc.getMessageList()); } byte[] data = parms[0].getOutputData(); int numReturned = BinaryConverter.byteArrayToInt(data, 0); while ((bufferSize - numReturned) <= 636) { bufferSize = bufferSize*2; try { parms[0].setOutputDataLength(bufferSize); parms[1].setInputData(BinaryConverter.intToByteArray(bufferSize)); } catch(PropertyVetoException pve) {} if (!pc.run()) { throw new AS400Exception(pc.getMessageList()); } data = parms[0].getOutputData(); numReturned = BinaryConverter.byteArrayToInt(data, 0); } //int orderArrayOffset = BinaryConverter.byteArrayToInt(data, 4); int userArrayOffset = BinaryConverter.byteArrayToInt(data, 8); int numEntries = BinaryConverter.byteArrayToInt(data, 12); byte continuationHandle = data[16]; String resourceHandle = conv.byteArrayToString(data, 17, 16); DirectoryEntry[] entries = new DirectoryEntry[numEntries]; offset = userArrayOffset; for (int i=0; i * If no key has been set, then the first entry added via addSelection() is used. * @return key * @see #setKey **/ public String getKey() { return keyValue_; } /** * Returns the system. * @return The system. * @see #setSystem **/ public AS400 getSystem() { return system_; } /** * Sets the primary selection ID used when searching the system distribution directory. * If the key has not been added as a selection ID by {@link #addSelection addSelection()} * then it has no effect on how the list is sorted when returned by {@link #getEntries getEntries()}. *

* If no key has been set, then the first entry added via addSelection() is used. * @param selectionID * @see #addSelection * @see #getKey **/ public void setKey(String selectionID) { keyValue_ = selectionID; } /** * Sets the system. * @param system The new system. * @see #getSystem **/ public void setSystem(AS400 system) { system_ = system; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy