This example has two parts:
<pcml version="1.0"> <struct name="receiver"> <data name="lengthOfEntry" type="int" length="4" /> <data name="dispToObjectPathName" type="int" length="4" /> <data name="lengthOfObjectPathName" type="int" length="4" /> <data name="ccsidOfObjectPathName" type="int" length="4" /> <data name="readOnlyFlag" type="int" length="4" /> <data name="nosuidFlag" type="int" length="4" /> <data name="dispToReadWriteHostNames" type="int" length="4" /> <data name="nbrOfReadWriteHostNames" type="int" length="4" /> <data name="dispToRootHostNames" type="int" length="4" /> <data name="nbrOfRootHostNames" type="int" length="4" /> <data name="dispToAccessHostNames" type="int" length="4" /> <data name="nbrOfAccessHostNames" type="int" length="4" /> <data name="dispToHostOptions" type="int" length="4" /> <data name="nbrOfHostOptions" type="int" length="4" /> <data name="anonUserID" type="int" length="4" /> <data name="anonUsrPrf" type="char" length="10" /> <data name="pathName" type="char" length="lengthOfObjectPathName" offset="dispToObjectPathName" offsetfrom="receiver" /> <struct name="rwAccessList" count="nbrOfReadWriteHostNames" offset="dispToReadWriteHostNames" offsetfrom="receiver"> <data name="lengthOfEntry" type="int" length="4" /> <data name="lengthOfHostName" type="int" length="4" /> <data name="hostName" type="char" length="lengthOfHostName" /> <data type="byte" length="0" offset="lengthOfEntry" /> </struct> <struct name="rootAccessList" count="nbrOfRootHostNames" offset="dispToRootHostNames" offsetfrom="receiver"> <data name="lengthOfEntry" type="int" length="4" /> <data name="lengthOfHostName" type="int" length="4" /> <data name="hostName" type="char" length="lengthOfHostName" /> <data type="byte" length="0" offset="lengthOfEntry" /> </struct> <struct name="accessHostNames" count="nbrOfAccessHostNames" offset="dispToAccessHostNames" offsetfrom="receiver" > <data name="lengthOfEntry" type="int" length="4" /> <data name="lengthOfHostName" type="int" length="4" /> <data name="hostName" type="char" length="lengthOfHostName" /> <data type="byte" length="0" offset="lengthOfEntry" /> </struct> <struct name="hostOptions" offset="dispToHostOptions" offsetfrom="receiver" count="nbrOfHostOptions"> <data name="lengthOfEntry" type="int" length="4" /> <data name="dataFileCodepage" type="int" length="4" /> <data name="pathNameCodepage" type="int" length="4" /> <data name="writeModeFlag" type="int" length="4" /> <data name="lengthOfHostName" type="int" length="4" /> <data name="hostName" type="char" length="lengthOfHostName" /> <data type="byte" length="0" offset="lengthOfEntry" /> </struct> <data type="byte" length="0" offset="lengthOfEntry" /> </struct> <struct name="returnedRcdsFdbkInfo"> <data name="bytesReturned" type="int" length="4" /> <data name="bytesAvailable" type="int" length="4" /> <data name="nbrOfNFSExportEntries" type="int" length="4" /> <data name="handle" type="int" length="4" /> </struct> <program name="qznfrtve" path="/QSYS.lib/QZNFRTVE.pgm" parseorder="returnedRcdsFdbkInfo receiver" > <data name="receiver" type="struct" struct="receiver" usage="output" count="returnedRcdsFdbkInfo.nbrOfNFSExportEntries" outputsize="receiverLength"/> <data name="receiverLength" type="int" length="4" usage="input" init="4096" /> <data name="returnedRcdsFdbkInfo" type="struct" struct="returnedRcdsFdbkInfo" usage="output" /> <data name="formatName" type="char" length="8" usage="input" init="EXPE0100" /> <data name="objectPathName" type="char" length="lengthObjPathName" usage="input" init="*FIRST" /> <data name="lengthObjPathName" type="int" length="4" usage="input" init="6" /> <data name="ccsidObjectPathName" type="int" length="4" usage="input" init="0" /> <data name="desiredCCSID" type="int" length="4" usage="input" init="0" /> <data name="handle" type="int" length="4" usage="input" init="0" /> <data name="errorCode" type="int" length="4" usage="input" init="0" /> </program> </pcml>
import com.ibm.as400.data.ProgramCallDocument; import com.ibm.as400.data.PcmlException; import com.ibm.as400.access.AS400; import com.ibm.as400.access.AS400Message; // Example program to call "Retrieve NFS Exports" (QZNFRTVE) API public class qznfrtve { public static void main(String[] argv) { AS400 as400System; // com.ibm.as400.access.AS400 ProgramCallDocument pcml; // com.ibm.as400.data.ProgramCallDocument boolean rc = false; // Return code from ProgramCallDocument.callProgram() String msgId, msgText; // Messages returned from the server Object value; // Return value from ProgramCallDocument.getValue() System.setErr(System.out); // Construct AS400 without parameters, user will be prompted as400System = new AS400(); int[] indices = new int[2]; // Indices for access array value int nbrExports; // Number of exports returned int nbrOfReadWriteHostNames, nbrOfRWHostNames, nbrOfRootHostNames, nbrOfAccessHostnames, nbrOfHostOpts; try { // Uncomment the following to get debugging information // com.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true); System.out.println("Beginning PCML Example.."); System.out.println(" Constructing ProgramCallDocument for QZNFRTVE API..."); // Construct ProgramCallDocument // First parameter is system to connect to // Second parameter is pcml resource name. In this example, // serialized PCML file "qznfrtve.pcml.ser" or // PCML source file "qznfrtve.pcml" must be found in the classpath. pcml = new ProgramCallDocument(as400System, "qznfrtve"); // Set input parameters. Several parameters have default values // specified in the PCML source. Do not need to set them using Java code. System.out.println(" Setting input parameters..."); pcml.setValue("qznfrtve.receiverLength", new Integer( ( pcml.getOutputsize("qznfrtve.receiver")))); // Request to call the API // User will be prompted to sign on to the system System.out.println(" Calling QZNFRTVE API requesting NFS exports."); rc = pcml.callProgram("qznfrtve"); if (rc == false) { // Retrieve list of server messages AS400Message[] msgs = pcml.getMessageList("qznfrtve"); // Iterate through messages and write them to standard output for (int m = 0; m < msgs.length; m++) { msgId = msgs[m].getID(); msgText = msgs[m].getText(); System.out.println(" " + msgId + " - " + msgText); } System.out.println("** Call to QZNFRTVE failed. See messages above **"); System.exit(0); } // Return code was true, call to QZNFRTVE succeeded // Write some of the results to standard output else { nbrExports = pcml.getIntValue("qznfrtve.returnedRcdsFdbkInfo.nbrOfNFSExportEntries"); // Iterate through list of exports for (indices[0] = 0; indices[0] < nbrExports; indices[0]++) { value = pcml.getValue("qznfrtve.receiver.pathName", indices); System.out.println("Path name = " + value); // Iterate and write out Read Write Host Names for this export nbrOfReadWriteHostNames = pcml.getIntValue("qznfrtve.receiver.nbrOfReadWriteHostNames", indices); for(indices[1] = 0; indices[1] < nbrOfReadWriteHostNames; indices[1]++) { value = pcml.getValue("qznfrtve.receiver.rwAccessList.hostName", indices); System.out.println(" Read/write access host name = " + value); } // Iterate and write out Root Host Names for this export nbrOfRootHostNames = pcml.getIntValue("qznfrtve.receiver.nbrOfRootHostNames", indices); for(indices[1] = 0; indices[1] < nbrOfRootHostNames; indices[1]++) { value = pcml.getValue("qznfrtve.receiver.rootAccessList.hostName", indices); System.out.println(" Root access host name = " + value); } // Iterate and write out Access Host Names for this export nbrOfAccessHostnames = pcml.getIntValue("qznfrtve.receiver.nbrOfAccessHostNames", indices); for(indices[1] = 0; indices[1] < nbrOfAccessHostnames; indices[1]++) { value = pcml.getValue("qznfrtve.receiver.accessHostNames.hostName", indices); System.out.println(" Access host name = " + value); } // Iterate and write out Host Options for this export nbrOfHostOpts = pcml.getIntValue("qznfrtve.receiver.nbrOfHostOptions", indices); for(indices[1] = 0; indices[1] < nbrOfHostOpts; indices[1]++) { System.out.println(" Host options:"); value = pcml.getValue("qznfrtve.receiver.hostOptions.dataFileCodepage", indices); System.out.println(" Data file code page = " + value); value = pcml.getValue("qznfrtve.receiver.hostOptions.pathNameCodepage", indices); System.out.println(" Path name code page = " + value); value = pcml.getValue("qznfrtve.receiver.hostOptions.writeModeFlag", indices); System.out.println(" Write mode flag = " + value); value = pcml.getValue("qznfrtve.receiver.hostOptions.hostName", indices); System.out.println(" Host name = " + value); } } // end for loop iterating list of exports } // end call to QZNFRTVE succeeded } catch(PcmlException e) { System.out.println(e.getLocalizedMessage()); e.printStackTrace(); System.exit(-1); } System.exit(0); } // end main() }