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

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

The newest version!
///////////////////////////////////////////////////////////////////////////////
//                                                                             
// JTOpen (IBM Toolbox for Java - OSS version)                              
//                                                                             
// Filename: AS400FileRecordDescriptionImplRemote.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-2001 International Business Machines Corporation and     
// others. All rights reserved.                                                
//                                                                             
///////////////////////////////////////////////////////////////////////////////

package com.ibm.as400.access;

import java.math.BigDecimal;
import java.io.IOException;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;

/**
 * Represents the record descriptions of a physical
 * or logical file on the server.  This class is used to retrieve the file field description
 * of a physical or logical file, and to create Java source code
 * for a class extending from
 * RecordFormat that
 * can then be compiled and used as input to the
 * AS400File.setRecordFormat()
 * method.
 * This allows the record format to be created statically during
 * development time and then reused when needed.
 * The class also provides a method for returning RecordFormat objects
 * that can be used as input to the AS400File.setRecordFormat() method.
 * This method can be used to create the record format dynamically.
 * 

The output from the createRecordFormatSource() * and * retrieveRecordFormat() methods * contains enough information to use to describe the record format of the * existing file from which it was generated. The record formats * generated are not meant for creating files with the same format as the * file from which they are retrieved. Use the IBM i "Copy File" (CPYF) command to create * a file with the same format as an existing file. *
* AS400FileRecordDescription objects generate the following events: *

    *
  • AS400FileRecordDescriptionEvent *
    The events fired are: *
      *
    • recordFormatRetrieved *
    • recordFormatSourceCreated *
    *
  • PropertyChangeEvent *
  • VetoableChangeEvent *
**/ class AS400FileRecordDescriptionImplRemote implements AS400FileRecordDescriptionImpl { static final long serialVersionUID = 4L; // File name private String file_ = ""; // Library name private String library_ = ""; // The IFS path name of the file private String name_ = ""; // SequentialFile object representing the file whose record description // is being retrieved private AS400FileImplBase theFile_ = null; //@C0C @B5C // The path name for the SequentialFile // The server where the file is located private AS400ImplRemote system_ = null; //@B5C // Used for synchronizing the QTEMP/JT4FFD and QTEMP/JT4FD files across threads private static Object lockJT4FFD_ = new Object(); //@E0A private static Object lockJT4FD_ = new Object(); //@E0A /** *Adds a field description to the specified RecordFormat object. The field description *is created with information extracted from the Record object provided. *@param rf The record format to which to add the field description. *@param record The record from which to obtain the field information. *@exception UnsupportedEncodingException If an error occurs during conversion. **/ void addFieldDescription(RecordFormat rf, Record record) throws UnsupportedEncodingException { char fieldType = ((String)record.getField("WHFLDT")).charAt(0); FieldDescription fd = null; int digits; int decimalPositions; int byteLength; //@A1A: For float field descriptions String fieldName = ((String)record.getField("WHFLDE")).trim(); int ccsid; switch(fieldType) { case 'A': // Character field // Need to get the length in bytes of the field and the ccsid of the field // when creating the AS400Text object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } fd = new CharacterFieldDescription( new AS400Text((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2: ((BigDecimal)record.getField("WHFLDB")).intValue(), ccsid, system_), //@D0C fieldName); if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword ((CharacterFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue()); } else { // No length was specified on the VARLEN keyword ((CharacterFieldDescription)fd).setVariableLength(true); } } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((CharacterFieldDescription)fd).setDFTNull(); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); ((CharacterFieldDescription)fd).setDFT(adjDft); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'B': // Binary field digits = ((BigDecimal)record.getField("WHFLDO")).intValue(); // if (digits < 6) if(digits < 5) // @A2C { fd = new BinaryFieldDescription(new AS400Bin2(), fieldName, fieldName, digits); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((BinaryFieldDescription)fd).setDFTNull(); } // Handle value else { ((BinaryFieldDescription)fd).setDFT(new Short(dft)); } } } else if (digits < 10) //@F0C { fd = new BinaryFieldDescription(new AS400Bin4(), fieldName, fieldName, digits); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((BinaryFieldDescription)fd).setDFTNull(); } // Handle value else { ((BinaryFieldDescription)fd).setDFT(new Integer(dft)); } } } else //@F0A { fd = new BinaryFieldDescription(new AS400Bin8(), fieldName, fieldName, digits); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((BinaryFieldDescription)fd).setDFTNull(); } // Handle value else { ((BinaryFieldDescription)fd).setDFT(new Long(dft)); } } } break; case 'E': // DBCS-Either field // Need to get the length in bytes of the field and the ccsid of the field // when creating the AS400Text object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } fd = new DBCSEitherFieldDescription( new AS400Text((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2: ((BigDecimal)record.getField("WHFLDB")).intValue(), ccsid, system_), //@D0C fieldName); if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword ((DBCSEitherFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue()); } else { // No length was specified on the VARLEN keyword ((DBCSEitherFieldDescription)fd).setVariableLength(true); } } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((DBCSEitherFieldDescription)fd).setDFTNull(); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); ((DBCSEitherFieldDescription)fd).setDFT(adjDft); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'F': // Float field digits = ((BigDecimal)record.getField("WHFLDO")).intValue(); decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue(); //@A1A: Retrieve byte length to determine if field is single or double // precision byteLength = ((BigDecimal)record.getField("WHFLDB")).intValue(); //@A1A if(byteLength == 4) //@A1A { fd = new FloatFieldDescription(new AS400Float4(), fieldName, fieldName, digits, decimalPositions); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((FloatFieldDescription)fd).setDFTNull(); } // Handle value else { ((FloatFieldDescription)fd).setDFT(new Float(dft)); } } } else if(byteLength == 8) //@A1A { fd = new FloatFieldDescription(new AS400Float8(), fieldName, fieldName, digits, decimalPositions); // Set the FLTPCN keyword to *DOUBLE ((FloatFieldDescription)fd).setFLTPCN("*DOUBLE"); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((FloatFieldDescription)fd).setDFTNull(); } // Handle value else { ((FloatFieldDescription)fd).setDFT(new Double(dft)); } } } else //@A1A: This should never occur, but for completeness.... { //@A1A Trace.log(Trace.ERROR, "FloatFieldDescription error in byte length"); //@A1A throw new InternalErrorException(InternalErrorException.UNKNOWN); //@A1A } //@A1A break; case 'G': // DBCS-Graphic field // Need to get the length in bytes of the field and the ccsid of the field // when creating the AS400Text object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } fd = new DBCSGraphicFieldDescription( new AS400Text((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2: ((BigDecimal)record.getField("WHFLDB")).intValue(), ccsid, system_), //@D0C fieldName); if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword ((DBCSGraphicFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue()); } else { // No length was specified on the VARLEN keyword ((DBCSGraphicFieldDescription)fd).setVariableLength(true); } } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((DBCSGraphicFieldDescription)fd).setDFTNull(); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); ((DBCSGraphicFieldDescription)fd).setDFT(adjDft); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'H': // Hex field case '5': // SQL Binary type // Need to get the length in bytes of the field // when creating the AS400ByteArray object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). fd = new HexFieldDescription( new AS400ByteArray((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2 : ((BigDecimal)record.getField("WHFLDB")).intValue()), fieldName); if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword ((HexFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue()); } else { // No length was specified on the VARLEN keyword ((HexFieldDescription)fd).setVariableLength(true); } } // @B0A: Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((HexFieldDescription)fd).setDFTNull(); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); byte[] dftBytes = adjDft.getBytes(); ((HexFieldDescription)fd).setDFT(dftBytes); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'J': // DBCS-Only field // Need to get the length in bytes of the field and the ccsid of the field // when creating the AS400Text object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } fd = new DBCSOnlyFieldDescription( new AS400Text((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2: ((BigDecimal)record.getField("WHFLDB")).intValue(), ccsid, system_), //@D0C fieldName); if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword ((DBCSOnlyFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue()); } else { // No length was specified on the VARLEN keyword ((DBCSOnlyFieldDescription)fd).setVariableLength(true); } } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((DBCSOnlyFieldDescription)fd).setDFTNull(); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); ((DBCSOnlyFieldDescription)fd).setDFT(adjDft); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'L': // Date field ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } fd = new DateFieldDescription( new AS400Text(((BigDecimal)record.getField("WHFLDB")).intValue(), ccsid, system_), //@D0C fieldName); // Set date format and date separator values ((DateFieldDescription)fd).setDATFMT((String)record.getField("WHFMT")); if(!((String)record.getField("WHFMT")).equals(" ")) { ((DateFieldDescription)fd).setDATSEP((String)record.getField("WHSEP")); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((DateFieldDescription)fd).setDFTNull(); } // Handle CURRENT_DATE (an SQL special value) else if(dft.indexOf("CURRENT_DATE") != -1) { ((DateFieldDescription)fd).setDFTCurrent(); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); ((DateFieldDescription)fd).setDFT(adjDft); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'O': // DBCS-Open field // Need to get the length in bytes of the field and the ccsid of the field // when creating the AS400Text object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } fd = new DBCSOpenFieldDescription( new AS400Text((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2: ((BigDecimal)record.getField("WHFLDB")).intValue(), ccsid, system_), //@D0C fieldName); if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword ((DBCSOpenFieldDescription)fd).setVARLEN(((BigDecimal)record.getField("WHALLC")).intValue()); } else { // No length was specified on the VARLEN keyword ((DBCSOpenFieldDescription)fd).setVariableLength(true); } } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((DBCSOpenFieldDescription)fd).setDFTNull(); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); ((DBCSOpenFieldDescription)fd).setDFT(adjDft); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'P': // Packed decimal field digits = ((BigDecimal)record.getField("WHFLDO")).intValue(); decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue(); fd = new PackedDecimalFieldDescription(new AS400PackedDecimal(digits, decimalPositions), fieldName); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((PackedDecimalFieldDescription)fd).setDFTNull(); } // Handle value else { ((PackedDecimalFieldDescription)fd).setDFT(new BigDecimal(dft)); } } break; case 'S': // Zoned decimal field digits = ((BigDecimal)record.getField("WHFLDO")).intValue(); decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue(); fd = new ZonedDecimalFieldDescription(new AS400ZonedDecimal(digits, decimalPositions), fieldName); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((ZonedDecimalFieldDescription)fd).setDFTNull(); } // Handle value else { ((ZonedDecimalFieldDescription)fd).setDFT(new BigDecimal(dft)); } } break; case 'T': // Time field ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } fd = new TimeFieldDescription( new AS400Text(((BigDecimal)record.getField("WHFLDB")).intValue(), ccsid, system_), //@D0C fieldName); // Set date format and date separator values ((TimeFieldDescription)fd).setTIMFMT((String)record.getField("WHFMT")); if(!((String)record.getField("WHSEP")).equals(" ")) { ((TimeFieldDescription)fd).setTIMSEP((String)record.getField("WHSEP")); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((TimeFieldDescription)fd).setDFTNull(); } // Handle CURRENT_TIME (an SQL special value) else if(dft.indexOf("CURRENT_TIME") != -1) { ((TimeFieldDescription)fd).setDFTCurrent(); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); ((TimeFieldDescription)fd).setDFT(adjDft); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'Z': // Timestamp field ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } fd = new TimestampFieldDescription( new AS400Text(((BigDecimal)record.getField("WHFLDB")).intValue(), ccsid, system_), //@D0C fieldName); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { ((TimestampFieldDescription)fd).setDFTNull(); } // Handle CURRENT_TIMESTAMP (an SQL special value) else if(dft.indexOf("CURRENT_TIMESTAMP") != -1) { ((TimestampFieldDescription)fd).setDFTCurrent(); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); ((TimestampFieldDescription)fd).setDFT(adjDft); } // Do nothing if a special value was present and we didn't know what // it was. } break; default: Trace.log(Trace.ERROR, "Unrecognized field type: " + fieldType); throw new InternalErrorException(InternalErrorException.UNKNOWN); } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { fd.setALWNULL(true); } // Set the field text fd.setTEXT(((String)record.getField("WHFTXT")).trim()); String value; // Set the ALIAS value = ((String)record.getField("WHALIS")).trim(); if(value.length() != 0) fd.setALIAS(value); // Set the REFFIL (reference file) value = ((String)record.getField("WHRFIL")).trim(); if(value.length() != 0) fd.setREFFIL(value); // Set the REFFLD (reference field) value = ((String)record.getField("WHRFLD")).trim(); if(value.length() != 0) fd.setREFFLD(value); // Set the REFFMT (reference record format) value = ((String)record.getField("WHRFMT")).trim(); if(value.length() != 0) fd.setREFFMT(value); // Set the REFLIB (reference library) value = ((String)record.getField("WHRLIB")).trim(); if(value.length() != 0) fd.setREFLIB(value); // Set the COLHDG (column heading) String colHdg1 = ((String)record.getField("WHCHD1")).trim(); String colHdg2 = ((String)record.getField("WHCHD2")).trim(); String colHdg3 = ((String)record.getField("WHCHD3")).trim(); if (colHdg1.length() == 0 && colHdg2.length() == 0 && colHdg3.length() == 0) {} // nothing to set else { // Concatenate the 3 "column heading" fields into a single string. // Delimit each part by single-quotes. // For example: "'FIRST PART' 'SECOND PART' 'THIRD PART'" StringBuffer sb = new StringBuffer(); if (colHdg1.length() == 0) sb.append("''"); else sb.append("'" + colHdg1 + "'"); if (colHdg2.length() == 0) { if (colHdg3.length() == 0) {} else sb.append(" ''"); } else sb.append(" '" + colHdg2 + "'"); if (colHdg3.length() == 0) {} else sb.append(" '" + colHdg3 + "'"); fd.setCOLHDG(sb.toString()); } // Add the field description rf.addFieldDescription(fd); } /** *Retrieves the file description for the file, and creates a file containing the Java source for *a class extending from RecordFormat that represents the record format for the file. If the *file contains more than one record format (for example, is a multiple format logical file), a Java *source file for each record format in the file is created; each file will contain the class *definition for a single record format.
*The name of the class is the name of the record format retrieved with the string "Format" *appended to it. The name of the file is the name of the class with the extension .java.
*The source files generated can be compiled and used as input to the *AS400File.setRecordFormat() method.
*The server to which to connect, and the integrated file system *pathname for the file, must be set prior to invoking this method. *@see AS400FileRecordDescription#AS400FileRecordDescription(com.ibm.as400.access.AS400, java.lang.String) *@see AS400FileRecordDescription#setPath *@see AS400FileRecordDescription#setSystem *@param packageName The name of the package in which the class belongs. The packageName *is used to specify the package statement in the source code for the class. * If this value is null, no package statement is specified in the source code for the class. *@exception AS400Exception If the system returns an error message. *@exception AS400SecurityException If a security or authority error occurs. *@exception ConnectionDroppedException If the connection is dropped unexpectedly. *@exception IOException If an error occurs while communicating with the *server. *@exception InterruptedException If this thread is interrupted. *@exception ServerStartupException If the host server cannot be started. *@return An array of Strings: { rfName0, contents0, rfName1, contents1, etc... }. **/ public /*@E0D synchronized */ String[] createRecordFormatSource(String packageName) //@C0C throws AS400Exception, AS400SecurityException, IOException, InterruptedException { // ------------------------------------------------------------ // Retrieve the field information for the file // ------------------------------------------------------------ // Generate file on the server containing the file field description // ------------------------------------------------------------ String cmd = "DSPFFD FILE(" + library_ + "/" + file_ + ") OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FFD)"; //@B5D theFile_.chooseImpl(); Record[] records = null; //@E0A synchronized(lockJT4FFD_) //@E0A { //@E0A AS400Message[] msgs = theFile_.execute(cmd); //@B5C if(msgs.length > 0) { if(!(msgs[0].getID().equals("CPF9861") || msgs[0].getID().equals("CPF3030"))) { throw new AS400Exception(msgs); } } else { // Unexpected reply Trace.log(Trace.ERROR, "DSPFFD failed to return success message", cmd); throw new InternalErrorException(InternalErrorException.UNKNOWN); } // Read all the records from the file so we can extract the field information locally //@B5D SequentialFile dspffd = new SequentialFile(system_, "/QSYS.LIB/QTEMP.LIB/JT4FFD.FILE"); AS400FileImplBase tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A "com.ibm.as400.access.AS400FileImplRemote"); //@B5A tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FFD.FILE", //@B5A new QWHDRFFDFormat(system_.getCcsid()), false, false, false); //@B5A //@B5D try //@B5D { //@B5D dspffd.setRecordFormat(new QWHDRFFDFormat(system_.getCcsid())); //@B5D } //@B5D catch(PropertyVetoException e) //@B5D { // Quiet the compiler //@B5D } records = tempFile.readAll("seq", 100); //@B5C @D1C @E0C tempFile.delete(); //@E0A } //@E0A // ------------------------------------------------------------ // Retrieve the key field information for the file // ------------------------------------------------------------ // Generate file on the server containing the key field description cmd = "DSPFD FILE(" + library_ + "/" + file_ + ") TYPE(*ACCPTH) OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FD)"; Record[] keyRecords = null; //@E0A synchronized(lockJT4FD_) //@E0A { //@E0A AS400Message[] msgs = theFile_.execute(cmd); //@B5C @E0C if(msgs.length > 0) { if(!(msgs[0].getID().equals("CPF9861") || msgs[0].getID().equals("CPF3030"))) { throw new AS400Exception(msgs); } } else { // Unexpected reply Trace.log(Trace.ERROR, "DSPFD failed to return success message", cmd); throw new InternalErrorException(InternalErrorException.UNKNOWN); } // Read all the records from the file so we can extract the key field information locally //@B5D dspffd = new SequentialFile(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE"); AS400FileImplBase tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A @E0C "com.ibm.as400.access.AS400FileImplRemote"); //@B5A tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE", //@B5A new QWHFDACPFormat(system_.getCcsid()), false, false, false); //@B5A //@B5D try //@B5D { //@B5D dspffd.setRecordFormat(new QWHFDACPFormat(system_.getCcsid())); //@B5D } //@B5D catch(PropertyVetoException e) //@B5D { // Quiet the compiler //@B5D } keyRecords = tempFile.readAll("key", 100); //@B5C @D1C @E0C tempFile.delete(); //@E0A } //@E0A // Determine the number of record formats contained in the file int numberOfRecordFormats = ((BigDecimal)records[0].getField("WHCNT")).intValue(); int numberOfFields = 0; int numberOfKeyFields = 0; int recordNumber = 0; int keyRecordNumber = 0; PrintWriter sourceFile; StringWriter sourceString; //@C0A String rfNameUntrimmed; String rfName; String[] filesToWrite = new String[numberOfRecordFormats*2]; //@C0A for(int i = 0; i < numberOfRecordFormats; ++i) { // Create source file for a particular record format // Determine the name of the record format and hence the name of the file and class rfNameUntrimmed = (String)records[recordNumber].getField("WHNAME"); // If the record format is a quoted name, replace the quotes with blanks rfName = rfNameUntrimmed.replace('"', ' ').trim(); filesToWrite[i] = rfName + "Format.java"; //@C0A sourceString = new StringWriter(/* 3000 */); //@C0A sourceFile = new PrintWriter(sourceString); //@C0C // Write the initial information to the file: // Nonexclusive license, diclaimer and copyright // Prolog // package statement // import statements // beginning of class definition sourceFile.println("/*******************************************************************************"); sourceFile.println(" This source is an example of the Java source necessary "); sourceFile.println(" to generate a RecordFormat subclass for file " + name_ + "."); sourceFile.println(" IBM grants you a nonexclusive license to use this source."); sourceFile.println(" You may change and use this souce as necessary."); sourceFile.println(); sourceFile.println(); sourceFile.println(" DISCLAIMER"); sourceFile.println(" ----------"); sourceFile.println(); sourceFile.println(" This source code is provided by IBM for illustrative purposes only."); sourceFile.println(" The source has not been thoroughly tested under all conditions."); sourceFile.println(" IBM, therefore, cannot guarantee or imply reliability, serviceability,"); sourceFile.println(" or function of the source. All source contained herein are provided to you \"AS IS\""); sourceFile.println(" without any warranties of any kind."); sourceFile.println(" ALL WARRANTIES, INCLUDING BUT NOT LIMITED TO THE IMPLIED"); sourceFile.println(" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR"); sourceFile.println(" PURPOSE, ARE EXPRESSLY DISCLAIMED."); sourceFile.println(); sourceFile.println(); sourceFile.println(" Your license to this source code provides you no right or licenses to"); sourceFile.println(" any IBM patents. IBM has no obligation to defend or indemnify against"); sourceFile.println(" any claim of infringement, including but not limited to: patents,"); sourceFile.println(" copyright, trade secret, or intellectual property rights of any kind."); sourceFile.println(); sourceFile.println(); sourceFile.println(" COPYRIGHT"); sourceFile.println(" ---------"); sourceFile.println("Copyright (C) 1997-1999 International Business Machines Corporation and others."); sourceFile.println("All rights reserved."); sourceFile.println("US Government Users Restricted Rights -"); sourceFile.println("Use, duplication or disclosure restricted"); sourceFile.println("by GSA ADP Schedule Contract with IBM Corp."); sourceFile.println("Licensed Material - Property of IBM"); sourceFile.println("********************************************************************************/"); sourceFile.println(); sourceFile.println("// Created by AS400FileRecordDescription on " + new Date()); sourceFile.println(); if(packageName != null) { sourceFile.println("package " + packageName + ";"); } sourceFile.println(); sourceFile.println("import java.math.BigDecimal;"); sourceFile.println("import com.ibm.as400.access.RecordFormat;"); sourceFile.println("import com.ibm.as400.access.AS400Bin2;"); sourceFile.println("import com.ibm.as400.access.AS400Bin4;"); sourceFile.println("import com.ibm.as400.access.AS400Bin8;"); //@F0A sourceFile.println("import com.ibm.as400.access.AS400ByteArray;"); sourceFile.println("import com.ibm.as400.access.AS400Float4;"); sourceFile.println("import com.ibm.as400.access.AS400Float8;"); sourceFile.println("import com.ibm.as400.access.AS400PackedDecimal;"); sourceFile.println("import com.ibm.as400.access.AS400Text;"); sourceFile.println("import com.ibm.as400.access.AS400ZonedDecimal;"); sourceFile.println("import com.ibm.as400.access.BinaryFieldDescription;"); sourceFile.println("import com.ibm.as400.access.CharacterFieldDescription;"); sourceFile.println("import com.ibm.as400.access.DateFieldDescription;"); sourceFile.println("import com.ibm.as400.access.DBCSEitherFieldDescription;"); sourceFile.println("import com.ibm.as400.access.DBCSGraphicFieldDescription;"); sourceFile.println("import com.ibm.as400.access.DBCSOnlyFieldDescription;"); sourceFile.println("import com.ibm.as400.access.DBCSOpenFieldDescription;"); sourceFile.println("import com.ibm.as400.access.FieldDescription;"); sourceFile.println("import com.ibm.as400.access.FloatFieldDescription;"); sourceFile.println("import com.ibm.as400.access.HexFieldDescription;"); sourceFile.println("import com.ibm.as400.access.PackedDecimalFieldDescription;"); sourceFile.println("import com.ibm.as400.access.TimeFieldDescription;"); sourceFile.println("import com.ibm.as400.access.TimestampFieldDescription;"); sourceFile.println("import com.ibm.as400.access.ZonedDecimalFieldDescription;"); sourceFile.println(); // Determine the name of the class from the file name sourceFile.println("public class " + rfName + "Format extends RecordFormat"); sourceFile.println("{"); sourceFile.println(); sourceFile.println(" public " + rfName + "Format()"); sourceFile.println(" {"); // Write out the call to super with the record format name sourceFile.println(" super(\"" + rfName + "\");"); // Get the field descriptions. numberOfFields = ((BigDecimal)records[recordNumber].getField("WHNFLD")).intValue(); if(numberOfFields > 0) { // Number of fields is greater than 0 sourceFile.println(" // Add field descriptions to this record format"); for(int j = 0; j < numberOfFields; ++j, ++recordNumber) { // Add a field description to the record format writeFieldDescription(sourceFile, records[recordNumber]); } } // Get the key field descriptions for this record format if there are any numberOfKeyFields = ((BigDecimal)keyRecords[keyRecordNumber].getField("APNKYF")).intValue(); if(numberOfKeyFields > 0) { // Number of key fields is greater than 0 sourceFile.println(" // Add key field descriptions to this record format"); for(int j = 0; j < numberOfKeyFields; ++j, ++keyRecordNumber) { // Add a key field description to the record format sourceFile.println(" addKeyFieldDescription(\"" + ((String)keyRecords[keyRecordNumber].getField("APKEYF")).trim() + "\");"); } } // End the class sourceFile.println(" }"); sourceFile.println("}"); if(sourceFile.checkError()) { sourceFile.close(); Trace.log(Trace.ERROR, "Error writing to sourceFile."); throw new InternalErrorException(InternalErrorException.UNKNOWN); } sourceFile.close(); filesToWrite[i+1] = sourceString.toString(); //@C0A } return filesToWrite; //@C0A } /** *Returns the attributes of a save file, as a record with format SaveFileAttrFormat. *This method is provided for exclusive use by the SaveFile class. *@return The save file's attributes. *@exception AS400Exception If the server returns an error message. *@exception AS400SecurityException If a security or authority error occurs. *@exception IOException If an error occurs while communicating with the *server. *@exception InterruptedException If this thread is interrupted. **/ Record getSavefileAttributes() throws AS400Exception, AS400SecurityException, InterruptedException, IOException { // Generate a file on the server, containing the basic attrs description. String cmd = "DSPFD FILE(" + library_ + "/" + file_ + ") TYPE(*ATR) FILEATR(*SAVF) OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FD)"; Record[] attrRecords = null; synchronized(lockJT4FD_) { AS400Message[] msgs = theFile_.execute(cmd); if(msgs.length > 0) { if(!(msgs[0].getID().equals("CPF9861") || msgs[0].getID().equals("CPF3030"))) { throw new AS400Exception(msgs); } } else { // Unexpected reply Trace.log(Trace.ERROR, "DSPFD failed to return success message", cmd); throw new InternalErrorException(InternalErrorException.UNKNOWN); } // Read all the records from the file so we can extract the key field information locally AS400FileImplBase tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative", "com.ibm.as400.access.AS400FileImplRemote"); tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE", new SaveFileAttrFormat(system_.getCcsid()), false, false, false); attrRecords = tempFile.readAll("seq", 100); if (attrRecords.length == 0) { Trace.log(Trace.ERROR, "No records were returned from command " + cmd); throw new InternalErrorException(InternalErrorException.UNKNOWN); } // Implementation note: I tried using read() and read(0) instead of readAll(), but some needed logic is missing along those paths; so we'll just use what works. tempFile.delete(); } return attrRecords[0]; } //@B5A /** * Used internally to parse the pathname and set the individual * library, filename, and member strings. **/ private void parseName(String name) { // Construct a QSYSObjectPathName object and parse out the library, // file and member names QSYSObjectPathName ifs = new QSYSObjectPathName(name); if(!(ifs.getObjectType().equals("FILE") || ifs.getObjectType().equals("MBR"))) { // Invalid object type throw new IllegalPathNameException(name, IllegalPathNameException.OBJECT_TYPE_NOT_VALID); } // Set the instance data as appropriate library_ = ifs.getLibraryName(); file_ = ifs.getObjectName(); name_ = name; } /** *Retrieves the file description for the file, and creates a RecordFormat *object for each record format, which can be used as input to the *AS400File.setRecordFormat() *method. If the file is a physical file, the RecordFormat array returned *contains one *RecordFormat object. If the file is a multiple format logical file, the *RecordFormat array may contain *more than one RecordFormat object. *The server to which to connect and the integrated file system *pathname for the file must be set prior to invoking this method. *@see AS400FileRecordDescription#AS400FileRecordDescription(com.ibm.as400.access.AS400, java.lang.String) *@see AS400FileRecordDescription#setPath *@see AS400FileRecordDescription#setSystem *@return The record format(s) for the file. *@exception AS400Exception If the server returns an error message. *@exception AS400SecurityException If a security or authority error occurs. *@exception ConnectionDroppedException If the connection is dropped unexpectedly. *@exception IOException If an error occurs while communicating with the *server. *@exception InterruptedException If this thread is interrupted. *@exception ServerStartupException If the host server cannot be started. **/ public /*@E0D synchronized */ RecordFormat[] retrieveRecordFormat() throws AS400Exception, AS400SecurityException, InterruptedException, IOException { // ------------------------------------------------------------ // Retrieve the field information for the file // ------------------------------------------------------------ // Generate file on the server containing the file field description // ------------------------------------------------------------ String cmd = "DSPFFD FILE(" + library_ + "/" + file_ + ") OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FFD)"; //@B5D theFile_.chooseImpl(); Record[] records = null; //@E0A boolean neededToResetCcsid = false; synchronized(lockJT4FFD_) //@E0A { //@E0A AS400FileImplBase tempFile = null; boolean done = false; for (int i=0; !done && i<2; i++) // no more than two tries { AS400Message[] msgs = theFile_.execute(cmd); //@B5C if(msgs.length > 0) { if(!(msgs[0].getID().equals("CPF9861") || // "Output file ... created in library ..." msgs[0].getID().equals("CPF3030"))) // "... records added to member ... in file ..." { throw new AS400Exception(msgs); } } else { // Unexpected reply Trace.log(Trace.ERROR, "DSPFFD failed to return success message", cmd); throw new InternalErrorException(InternalErrorException.UNKNOWN); } // Read all the records from the file so we can extract the field information locally //@B5D SequentialFile dspffd = new SequentialFile(system_, "/QSYS.LIB/QTEMP.LIB/JT4FFD.FILE"); if (tempFile == null) { tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A "com.ibm.as400.access.AS400FileImplRemote"); //@B5A tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FFD.FILE", //@B5A new QWHDRFFDFormat(system_.getCcsid()), false, false, false); //@B5A } //@B5D try //@B5D { //@B5D dspffd.setRecordFormat(new QWHDRFFDFormat(system_.getCcsid())); //@B5D } //@B5D catch(PropertyVetoException e) //@B5D { // Quiet the compiler //@B5D } records = tempFile.readAll("seq", 100); //@B5C @D1C @E0C if (records.length == 0) { // We got no records back. Assume that it's because the default CCSID for the outfile was incompatible with the CCSID for the file's format. // Reset the outfile's CCSID and try again. done = false; neededToResetCcsid = true; int ccsid = system_.getCcsid(); if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "No records were returned from command " + cmd + "; system CCSID is: " + ccsid + ". Resetting CCSID of DSPFFD OUTFILE to " + ccsid); resetOutfileCCSID("QTEMP", "JT4FFD", ccsid); } else done = true; } // 'for' loop tempFile.delete(); //@E0A } // 'synchronized' block if (records.length == 0) { Trace.log(Trace.ERROR, "No records were returned from command " + cmd); throw new InternalErrorException(InternalErrorException.UNKNOWN); } // ------------------------------------------------------------ // Retrieve the key field information for the file // ------------------------------------------------------------ // Generate file on the server containing the key field description cmd = "DSPFD FILE(" + library_ + "/" + file_ + ") TYPE(*ACCPTH) OUTPUT(*OUTFILE) OUTFILE(QTEMP/JT4FD)"; Record[] keyRecords = null; //@E0A synchronized(lockJT4FD_) //@E0A { //@E0A AS400FileImplBase tempFile = null; boolean done = false; for (int i=0; !done && i<2; i++) // no more than two tries { AS400Message[] msgs = theFile_.execute(cmd); //@B5C @E0C if(msgs.length > 0) { if(!(msgs[0].getID().equals("CPF9861") || msgs[0].getID().equals("CPF3030"))) { throw new AS400Exception(msgs); } } else { // Unexpected reply Trace.log(Trace.ERROR, "DSPFD failed to return success message", cmd); throw new InternalErrorException(InternalErrorException.UNKNOWN); } // Read all the records from the file so we can extract the key field information locally //@B5D dspffd = new SequentialFile(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE"); if (tempFile == null) { tempFile = (AS400FileImplBase)system_.loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A @E0C "com.ibm.as400.access.AS400FileImplRemote"); //@B5A tempFile.setAll(system_, "/QSYS.LIB/QTEMP.LIB/JT4FD.FILE", //@B5A new QWHFDACPFormat(system_.getCcsid()), false, false, false); //@B5A } //@B5D try //@B5D { //@B5D dspffd.setRecordFormat(new QWHFDACPFormat(system_.getCcsid())); //@B5D } //@B5D catch(PropertyVetoException e) //@B5D { // Quiet the compiler //@B5D } keyRecords = tempFile.readAll("key", 100); //@B5C @D1C @E0C // If we needed to reset the CCSID of the DSPFD temp file, we probably also need to reset the CCSID of the DSPFD temp file. if (keyRecords.length == 0 && neededToResetCcsid) { // We got no records back. Assume that it's because the default CCSID for the outfile was incompatible with the CCSID for the file's format. // Reset the outfile's CCSID and try again. done = false; int ccsid = system_.getCcsid(); if (Trace.traceOn_) Trace.log(Trace.DIAGNOSTIC, "No key records were returned from command " + cmd + "; system CCSID is: " + ccsid + ". Resetting CCSID of DSPFD OUTFILE to " + ccsid); resetOutfileCCSID("QTEMP", "JT4FD", ccsid); } else done = true; } // 'for' loop tempFile.delete(); //@E0A } //@E0A // Determine the number of record formats contained in the file int numberOfRecordFormats = ((BigDecimal)records[0].getField("WHCNT")).intValue(); int numberOfFields = 0; int numberOfKeyFields = 0; int recordNumber = 0; int keyRecordNumber = 0; String rfNameUntrimmed; String rfName; RecordFormat[] rfs = new RecordFormat[numberOfRecordFormats]; for(int i = 0; i < numberOfRecordFormats; ++i) { // Create source file for a particular record format // Determine the name of the record format and hence the name of the file and class rfNameUntrimmed = (String)records[recordNumber].getField("WHNAME"); rfName = rfNameUntrimmed.trim(); rfs[i] = new RecordFormat(rfName); // Get the field descriptions. numberOfFields = ((BigDecimal)records[recordNumber].getField("WHNFLD")).intValue(); if(numberOfFields > 0) { // Number of fields is greater than 0 for(int j = 0; j < numberOfFields; ++j, ++recordNumber) { // Add a field description to the record format addFieldDescription(rfs[i], records[recordNumber]); } } // Get the key field descriptions for this record format if there are any numberOfKeyFields = ((BigDecimal)keyRecords[keyRecordNumber].getField("APNKYF")).intValue(); if(numberOfKeyFields > 0) { // Number of key fields is greater than 0 for(int j = 0; j < numberOfKeyFields; ++j, ++keyRecordNumber) { // Add a key field description to the record format rfs[i].addKeyFieldDescription(((String)keyRecords[keyRecordNumber].getField("APKEYF")).trim()); } } } return rfs; } private final void resetOutfileCCSID(String library, String file, int ccsid) throws AS400Exception, AS400SecurityException, InterruptedException, IOException { String cmd = "CHGPF FILE(" + library + "/" + file + ") SRCFILE(*NONE) CCSID("+ccsid+")"; AS400Message[] msgs = theFile_.execute(cmd); if(msgs.length > 0) { if(!(msgs[0].getID().equals("CPD3238") || // "A new format was created for file ..." msgs[0].getID().equals("CPC7303"))) // "File JT4FFD in library QTEMP changed" { throw new AS400Exception(msgs); } } else { // Unexpected reply Trace.log(Trace.ERROR, "CHGPF failed to return success message", cmd); throw new InternalErrorException(InternalErrorException.UNKNOWN); } } /** *Sets the integrated file system path name for *the file. *@param name The integrated file system path name *of the file. If a member is not specified in name, the first *member of the file is used. **/ public void setPath(String name) { if(theFile_ != null) //@B5A { theFile_.setPath(name); } parseName(name); //@B5A name_ = name; } /** *Sets the system to which to connect. *@param system The system to which to conenct. **/ public void setSystem(AS400Impl system) //@B5C { if(theFile_ == null) //@B5A { theFile_ = (AS400FileImplBase)((AS400ImplRemote)system).loadImpl("com.ibm.as400.access.AS400FileImplNative", //@B5A "com.ibm.as400.access.AS400FileImplRemote"); //@B5A if(!name_.equals("")) //@B5A { theFile_.setPath(name_); //@B5A } } theFile_.setSystem(system); system_ = (AS400ImplRemote)system; //@B5C } /** *Writes a field description to the specified file. The field description *is created with information extracted from the Record object provided. *@param sourceFile The file to which to write the field description. *@param record The record from which to obtain the field information. * @throws UnsupportedEncodingException If an error occurs during conversion. **/ public void writeFieldDescription(PrintWriter sourceFile, Record record) throws UnsupportedEncodingException { char fieldType = ((String)record.getField("WHFLDT")).charAt(0); FieldDescription fd = null; int digits; int decimalPositions; int byteLength; //@A1A: For float field descriptions String fieldName = ((String)record.getField("WHFLDE")).trim(); int ccsid; switch(fieldType) { case 'A': // Character field // Need to get the length in bytes of the field and the ccsid of the field // when creating the AS400Text object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } sourceFile.println(" addFieldDescription(new CharacterFieldDescription(new AS400Text(" + String.valueOf((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2 : ((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " + ccsid + "), \"" + fieldName + "\"));"); if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword sourceFile.println(" ((CharacterFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");"); } else { // No length was specified on the VARLEN keyword sourceFile.println(" ((CharacterFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVariableLength(true);"); } } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((CharacterFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); sourceFile.println(" ((CharacterFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(\"" + adjDft + "\");"); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'B': // Binary field digits = ((BigDecimal)record.getField("WHFLDO")).intValue(); // if (digits < 6) if(digits < 5) // @A2C { sourceFile.println(" addFieldDescription(new BinaryFieldDescription(new AS400Bin2(), \"" + fieldName + "\", \"" + fieldName + "\", " + String.valueOf(digits) + "));"); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle value else { sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(new Short(\"" + dft + "\"));"); } } } else if (digits < 10) //@F0C { sourceFile.println(" addFieldDescription(new BinaryFieldDescription(new AS400Bin4(), \"" + fieldName + "\", \"" + fieldName + "\", " + String.valueOf(digits) + "));"); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle value else { sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(new Integer(\"" + dft + "\"));"); } } } else //@F0A { sourceFile.println(" addFieldDescription(new BinaryFieldDescription(new AS400Bin8(), \"" + fieldName + "\", \"" + fieldName + "\", " + String.valueOf(digits) + "));"); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle value else { sourceFile.println(" ((BinaryFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(new Long(\"" + dft + "\"));"); } } } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } break; case 'E': // DBCS-Either field // Need to get the length in bytes of the field and the ccsid of the field // when creating the AS400Text object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } sourceFile.println(" addFieldDescription(new DBCSEitherFieldDescription(new AS400Text(" + String.valueOf((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2 : ((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " + ccsid + "), \"" + fieldName + "\"));"); // Set if variable length if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword sourceFile.println(" ((DBCSEitherFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");"); } else { // No length was specified on the VARLEN keyword sourceFile.println(" ((DBCSEitherFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVariableLength(true);"); } } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((DBCSEitherFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); sourceFile.println(" ((DBCSEitherFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(\"" + adjDft + "\");"); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'F': // Float field digits = ((BigDecimal)record.getField("WHFLDO")).intValue(); decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue(); //@A1A: Retrieve byte length to determine if field is single or double // precision byteLength = ((BigDecimal)record.getField("WHFLDB")).intValue(); //@A1A if(byteLength == 4) //@A1A { sourceFile.println(" addFieldDescription(new FloatFieldDescription(new AS400Float4(), \"" + fieldName + "\", \"" + fieldName + "\", " + String.valueOf(digits) + ", " + String.valueOf(decimalPositions) + "));"); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle value else { sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(new Float(\"" + dft + "\"));"); } } } else if(byteLength == 8) //@A1A { sourceFile.println(" addFieldDescription(new FloatFieldDescription(new AS400Float8(), \"" + fieldName + "\", \"" + fieldName + "\", " + String.valueOf(digits) + ", " + String.valueOf(decimalPositions) + "));"); // Set the FLTPCN keyword to *DOUBLE sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" + fieldName + "\")).setFLTPCN(\"*DOUBLE\");"); // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle value else { sourceFile.println(" ((FloatFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(new Double(\"" + dft + "\"));"); } } } else //@A1A: This should never occur, but for completeness.... { //@A1A Trace.log(Trace.ERROR, "FloatFieldDescription error in byte length"); throw new InternalErrorException(InternalErrorException.UNKNOWN); //@A1A } //@A1A // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } break; case 'G': // DBCS-Graphic field // Need to get the length in bytes of the field and the ccsid of the field // when creating the AS400Text object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } sourceFile.println(" addFieldDescription(new DBCSGraphicFieldDescription(new AS400Text(" + String.valueOf((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2 : ((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " + ccsid + "), \"" + fieldName + "\"));"); // Set if variable length if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword sourceFile.println(" ((DBCSGraphicFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");"); } else { // No length was specified on the VARLEN keyword sourceFile.println(" ((DBCSGraphicFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVariableLength(true);"); } } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((DBCSGraphicFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); sourceFile.println(" ((DBCSGraphicFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(\"" + adjDft + "\");"); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'H': // Hex field // Need to get the length in bytes of the field // when creating the AS400ByteArray object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). sourceFile.println(" addFieldDescription(new HexFieldDescription(new AS400ByteArray(" + String.valueOf((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2 : ((BigDecimal)record.getField("WHFLDB")).intValue()) + "), \"" + fieldName + "\"));"); // Set if variable length if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword sourceFile.println(" ((HexFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");"); } else { // No length was specified on the VARLEN keyword sourceFile.println(" ((HexFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVariableLength(true);"); } } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // @B0A: Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((HexFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); byte[] byteDft = adjDft.getBytes(); sourceFile.print(" ((HexFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(new byte[] { "); sourceFile.print(byteDft[0]); for(int i=1; i 0) { // A length was specified on the VARLEN keyword sourceFile.println(" ((DBCSOnlyFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");"); } else { // No length was specified on the VARLEN keyword sourceFile.println(" ((DBCSOnlyFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVariableLength(true);"); } } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((DBCSOnlyFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); sourceFile.println(" ((DBCSOnlyFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(\"" + adjDft + "\");"); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'L': // Date field ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } sourceFile.println(" addFieldDescription(new DateFieldDescription(new AS400Text(" + String.valueOf(((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " + ccsid + "), \"" + fieldName + "\"));"); // Set date format and date separator values sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDATFMT(\"" + (String)record.getField("WHFMT") + "\");"); if(!((String)record.getField("WHSEP")).equals(" ")) { sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDATSEP(\"" + (String)record.getField("WHSEP") + "\");"); } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle CURRENT_DATE (an SQL special value) else if(dft.indexOf("CURRENT_DATE") != -1) { sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTCurrent();"); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); sourceFile.println(" ((DateFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(\"" + adjDft + "\");"); } } break; case 'O': // DBCS-Open field // Need to get the length in bytes of the field and the ccsid of the field // when creating the AS400Text object. The name of the field is set to be // the DDS name of the field (which causes the DDS name of the field description // to be the DDS name as well). ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } sourceFile.println(" addFieldDescription(new DBCSOpenFieldDescription(new AS400Text(" + String.valueOf((((String)record.getField("WHVARL")).equals("Y"))? ((BigDecimal)record.getField("WHFLDB")).intValue() - 2 : ((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " + ccsid + "), \"" + fieldName + "\"));"); // Set if variable length if(((String)record.getField("WHVARL")).equals("Y")) { if(((BigDecimal)record.getField("WHALLC")).intValue() > 0) { // A length was specified on the VARLEN keyword sourceFile.println(" ((DBCSOpenFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVARLEN(" + ((BigDecimal)record.getField("WHALLC")).intValue() + ");"); } else { // No length was specified on the VARLEN keyword sourceFile.println(" ((DBCSOpenFieldDescription)getFieldDescription(\"" + fieldName + "\")).setVariableLength(true);"); } } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((DBCSOpenFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); sourceFile.println(" ((DBCSOpenFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(\"" + adjDft + "\");"); } // Do nothing if a special value was present and we didn't know what // it was. } break; case 'P': // Packed decimal field digits = ((BigDecimal)record.getField("WHFLDO")).intValue(); decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue(); sourceFile.println(" addFieldDescription(new PackedDecimalFieldDescription(new AS400PackedDecimal(" + String.valueOf(digits) + ", " + String.valueOf(decimalPositions) + "), \"" + fieldName + "\"));"); // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((PackedDecimalFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle value else { sourceFile.println(" ((PackedDecimalFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(new BigDecimal(\"" + dft + "\"));"); } } break; case 'S': // Zoned decimal field digits = ((BigDecimal)record.getField("WHFLDO")).intValue(); decimalPositions = ((BigDecimal)record.getField("WHFLDP")).intValue(); sourceFile.println(" addFieldDescription(new ZonedDecimalFieldDescription(new AS400ZonedDecimal(" + String.valueOf(digits) + ", " + String.valueOf(decimalPositions) + "), \"" + fieldName + "\"));"); // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { String dft = ((String)record.getField("WHDFT")).trim(); if(dft.charAt(0) == '+') { dft = dft.substring(1); } // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((ZonedDecimalFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle value else { sourceFile.println(" ((ZonedDecimalFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(new BigDecimal(\"" + dft + "\"));"); } } break; case 'T': // Time field ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } sourceFile.println(" addFieldDescription(new TimeFieldDescription(new AS400Text(" + String.valueOf(((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " + ccsid + "), \"" + fieldName + "\"));"); // Set date format and date separator values sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" + fieldName + "\")).setTIMFMT(\"" + (String)record.getField("WHFMT") + "\");"); if(!((String)record.getField("WHSEP")).equals(" ")) { sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" + fieldName + "\")).setTIMSEP(\"" + (String)record.getField("WHSEP") + "\");"); } // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle CURRENT_TIME (an SQL special value) else if(dft.indexOf("CURRENT_TIME") != -1) { sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTCurrent();"); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); sourceFile.println(" ((TimeFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(\"" + adjDft + "\");"); } } break; case 'Z': // Timestamp field ccsid = ((BigDecimal)record.getField("WHCCSID")).intValue(); if(ccsid == 65535) { // 65535 is not a valid ccsid, retrieve the default system ccsid ccsid = system_.getCcsid(); } sourceFile.println(" addFieldDescription(new TimestampFieldDescription(new AS400Text(" + String.valueOf(((BigDecimal)record.getField("WHFLDB")).intValue()) + ", " + ccsid + "), \"" + fieldName + "\"));"); // Set if null values are allowed if(((String)record.getField("WHNULL")).equals("Y")) { sourceFile.println(" getFieldDescription(\"" + fieldName + "\").setALWNULL(true);"); } // Set the DFT keyword value if specified if(((BigDecimal)record.getField("WHDFTL")).intValue() > 0) { // Need to strip off the beginning and ending apostrophes String dft = (String)record.getField("WHDFT"); // @B0C // Check for any special values that could be specified as the default. // Handle *NULL if(dft.indexOf("*NULL") != -1) { sourceFile.println(" ((TimestampFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTNull();"); } // Handle CURRENT_TIMESTAMP (an SQL special value) else if(dft.indexOf("CURRENT_TIMESTAMP") != -1) { sourceFile.println(" ((TimestampFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFTCurrent();"); } // Handle 'value' else if(dft.indexOf("'") != -1) { String adjDft = dft.substring(dft.indexOf("'") + 1, dft.lastIndexOf("'")); sourceFile.println(" ((TimestampFieldDescription)getFieldDescription(\"" + fieldName + "\")).setDFT(\"" + adjDft + "\");"); } } break; } } } /** *Class representing the record format of the data returned from the *DSPFD command (Display File Description) when the type of data requested *is *ACCPTH. *ACCPTH returns data describing the key fields of the file *if any exist. **/ class QWHFDACPFormat extends RecordFormat { static final long serialVersionUID = 4L; // @B6A QWHFDACPFormat(int ccsid) { super("QWHFDACP"); AS400Text txt1 = new AS400Text(1, ccsid); AS400Text txt3 = new AS400Text(3, ccsid); AS400Text txt4 = new AS400Text(4, ccsid); AS400Text txt6 = new AS400Text(6, ccsid); AS400Text txt8 = new AS400Text(8, ccsid); AS400Text txt10 = new AS400Text(10, ccsid); AS400PackedDecimal p30 = new AS400PackedDecimal(3, 0); addFieldDescription(new CharacterFieldDescription(txt1, "APRCEN")); addFieldDescription(new CharacterFieldDescription(txt6, "APRDAT")); addFieldDescription(new CharacterFieldDescription(txt6, "APRTIM")); addFieldDescription(new CharacterFieldDescription(txt10, "APFILE")); addFieldDescription(new CharacterFieldDescription(txt10, "APLIB")); addFieldDescription(new CharacterFieldDescription(txt1, "APFTYP")); addFieldDescription(new CharacterFieldDescription(txt4, "APFILA")); addFieldDescription(new CharacterFieldDescription(txt3, "APMXD")); addFieldDescription(new CharacterFieldDescription(txt6, "APFATR")); addFieldDescription(new CharacterFieldDescription(txt8, "APSYSN")); addFieldDescription(new PackedDecimalFieldDescription(p30, "APASP")); addFieldDescription(new CharacterFieldDescription(txt4, "APRES")); addFieldDescription(new CharacterFieldDescription(txt1, "APMANT")); addFieldDescription(new CharacterFieldDescription(txt1, "APUNIQ")); addFieldDescription(new CharacterFieldDescription(txt1, "APKEYO")); addFieldDescription(new CharacterFieldDescription(txt1, "APSELO")); addFieldDescription(new CharacterFieldDescription(txt1, "APACCP")); addFieldDescription(new PackedDecimalFieldDescription(p30, "APNSCO")); addFieldDescription(new CharacterFieldDescription(txt10, "APBDF")); addFieldDescription(new CharacterFieldDescription(txt10, "APBOL")); addFieldDescription(new CharacterFieldDescription(txt10, "APBOLF")); addFieldDescription(new PackedDecimalFieldDescription(p30, "APNKYF")); addFieldDescription(new CharacterFieldDescription(txt10, "APKEYF")); addFieldDescription(new CharacterFieldDescription(txt1, "APKSEQ")); addFieldDescription(new CharacterFieldDescription(txt1, "APKSIN")); addFieldDescription(new CharacterFieldDescription(txt1, "APKZD")); addFieldDescription(new CharacterFieldDescription(txt1, "APKASQ")); addFieldDescription(new PackedDecimalFieldDescription(p30, "APKEYN")); addFieldDescription(new CharacterFieldDescription(txt1, "APJOIN")); addFieldDescription(new CharacterFieldDescription(txt1, "APACPJ")); addFieldDescription(new CharacterFieldDescription(txt1, "APRIKY")); } } /** *Class representing the record format of the data returned from the *DSPFD command (Display File Description) when the type of data requested *is *RCDFMT. *RCDFMT returns data describing the record format of the file. **/ class QWHFDFMTFormat extends RecordFormat { static final long serialVersionUID = 4L; // @B6A QWHFDFMTFormat(int ccsid) { super("QWHFDFMT"); AS400Text txt1 = new AS400Text(1, ccsid); AS400Text txt4 = new AS400Text(4, ccsid); AS400Text txt6 = new AS400Text(6, ccsid); AS400Text txt8 = new AS400Text(8, ccsid); AS400Text txt10 = new AS400Text(10, ccsid); AS400Text txt13 = new AS400Text(13, ccsid); AS400Text txt50 = new AS400Text(50, ccsid); AS400PackedDecimal p30 = new AS400PackedDecimal(3, 0); AS400PackedDecimal p31 = new AS400PackedDecimal(3, 1); AS400PackedDecimal p41 = new AS400PackedDecimal(4, 1); AS400PackedDecimal p40 = new AS400PackedDecimal(4, 0); AS400PackedDecimal p50 = new AS400PackedDecimal(5, 0); addFieldDescription(new CharacterFieldDescription(txt1, "RFRCEN")); addFieldDescription(new CharacterFieldDescription(txt6, "RFRDAT")); addFieldDescription(new CharacterFieldDescription(txt6, "RFRTIM")); addFieldDescription(new CharacterFieldDescription(txt10, "RFFILE")); addFieldDescription(new CharacterFieldDescription(txt10, "RFLIB")); addFieldDescription(new CharacterFieldDescription(txt1, "RFFTYP")); addFieldDescription(new CharacterFieldDescription(txt4, "RFFILA")); addFieldDescription(new CharacterFieldDescription(txt1, "RFMXDD")); addFieldDescription(new CharacterFieldDescription(txt1, "RFMXDC")); addFieldDescription(new CharacterFieldDescription(txt1, "RFMXDB")); addFieldDescription(new CharacterFieldDescription(txt6, "RFFATR")); addFieldDescription(new CharacterFieldDescription(txt8, "RFSYSN")); addFieldDescription(new PackedDecimalFieldDescription(p30, "RFASP")); addFieldDescription(new CharacterFieldDescription(txt4, "RFRES")); addFieldDescription(new PackedDecimalFieldDescription(p40, "RFTOTF")); addFieldDescription(new CharacterFieldDescription(txt10, "RFNAME")); addFieldDescription(new PackedDecimalFieldDescription(p50, "RFFLDN")); addFieldDescription(new PackedDecimalFieldDescription(p50, "RFLEN")); addFieldDescription(new CharacterFieldDescription(txt13, "RFID")); addFieldDescription(new CharacterFieldDescription(txt1, "RFTYPE")); addFieldDescription(new CharacterFieldDescription(txt10, "RFASFN")); addFieldDescription(new CharacterFieldDescription(txt50, "RFFTXT")); addFieldDescription(new PackedDecimalFieldDescription(p40, "RFHIGH")); addFieldDescription(new PackedDecimalFieldDescription(p50, "RFWIDE")); addFieldDescription(new CharacterFieldDescription(txt10, "RFFONT")); addFieldDescription(new PackedDecimalFieldDescription(p30, "RFPGRT")); addFieldDescription(new PackedDecimalFieldDescription(p31, "RFLPI")); addFieldDescription(new PackedDecimalFieldDescription(p31, "RFCHWD")); addFieldDescription(new PackedDecimalFieldDescription(p31, "RFCHHI")); addFieldDescription(new PackedDecimalFieldDescription(p41, "RFPNTS")); addFieldDescription(new CharacterFieldDescription(txt1, "RFWIN")); addFieldDescription(new CharacterFieldDescription(txt10, "RFFCSN")); addFieldDescription(new CharacterFieldDescription(txt10, "RFFCSL")); addFieldDescription(new CharacterFieldDescription(txt10, "RFFCPN")); addFieldDescription(new CharacterFieldDescription(txt10, "RFFCPL")); addFieldDescription(new CharacterFieldDescription(txt10, "RFCDFN")); addFieldDescription(new CharacterFieldDescription(txt10, "RFCDFL")); addFieldDescription(new CharacterFieldDescription(txt10, "RFDCDF")); addFieldDescription(new CharacterFieldDescription(txt10, "RFDCDL")); addFieldDescription(new CharacterFieldDescription(txt1, "RFMNB")); addFieldDescription(new CharacterFieldDescription(txt1, "RFPLD")); } } /** *Class representing the record format of the data returned from the *DSPFFD command (Display File Field Description). **/ class QWHDRFFDFormat extends RecordFormat { static final long serialVersionUID = 4L; // @B6A QWHDRFFDFormat(int ccsid) { super("QWHDRFFD"); AS400Text txt1 = new AS400Text(1, ccsid); AS400Text txt2 = new AS400Text(2, ccsid); AS400Text txt4 = new AS400Text(4, ccsid); AS400Text txt7 = new AS400Text(7, ccsid); AS400Text txt8 = new AS400Text(8, ccsid); AS400Text txt10 = new AS400Text(10, ccsid); AS400Text txt13 = new AS400Text(13, ccsid); AS400Text txt20 = new AS400Text(20, ccsid); AS400Text txt30 = new AS400Text(30, ccsid); AS400Text txt32 = new AS400Text(32, ccsid); AS400Text txt50 = new AS400Text(50, ccsid); AS400PackedDecimal p30 = new AS400PackedDecimal(3, 0); AS400PackedDecimal p50 = new AS400PackedDecimal(5, 0); AS400PackedDecimal p41 = new AS400PackedDecimal(4, 1); AS400ZonedDecimal z20 = new AS400ZonedDecimal(2, 0); AS400ZonedDecimal z30 = new AS400ZonedDecimal(3, 0); AS400ZonedDecimal z40 = new AS400ZonedDecimal(4, 0); AS400ZonedDecimal z50 = new AS400ZonedDecimal(5, 0); AS400ZonedDecimal z31 = new AS400ZonedDecimal(3, 1); addFieldDescription(new CharacterFieldDescription(txt10, "WHFILE")); addFieldDescription(new CharacterFieldDescription(txt10, "WHLIB")); addFieldDescription(new CharacterFieldDescription(txt7, "WHCRTD")); addFieldDescription(new CharacterFieldDescription(txt1, "WHFTYP")); addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHCNT")); addFieldDescription(new CharacterFieldDescription(txt13, "WHDTTM")); // Record format name addFieldDescription(new CharacterFieldDescription(txt10, "WHNAME")); addFieldDescription(new CharacterFieldDescription(txt13, "WHSEQ")); addFieldDescription(new CharacterFieldDescription(txt50, "WHTEXT")); addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFLDN")); addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHRLEN")); addFieldDescription(new CharacterFieldDescription(txt10, "WHFLDI")); // External field name addFieldDescription(new CharacterFieldDescription(txt10, "WHFLDE")); addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFOBO")); addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFIBO")); // Field length in bytes addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFLDB")); // Number of digits addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHFLDO")); // Number of decimal positions addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHFLDP")); // Field text description addFieldDescription(new CharacterFieldDescription(txt50, "WHFTXT")); addFieldDescription(new ZonedDecimalFieldDescription(z30, "WHRCDE")); // Reference file addFieldDescription(new CharacterFieldDescription(txt10, "WHRFIL")); // Reference library addFieldDescription(new CharacterFieldDescription(txt10, "WHRLIB")); // Reference record format addFieldDescription(new CharacterFieldDescription(txt10, "WHRFMT")); // Reference field addFieldDescription(new CharacterFieldDescription(txt10, "WHRFLD")); // Column heading 1 addFieldDescription(new CharacterFieldDescription(txt20, "WHCHD1")); // Column heading 2 addFieldDescription(new CharacterFieldDescription(txt20, "WHCHD2")); // Column heading 3 addFieldDescription(new CharacterFieldDescription(txt20, "WHCHD3")); // Field type addFieldDescription(new CharacterFieldDescription(txt1, "WHFLDT")); addFieldDescription(new CharacterFieldDescription(txt1, "WHFIOB")); addFieldDescription(new CharacterFieldDescription(txt2, "WHECDE")); addFieldDescription(new CharacterFieldDescription(txt32, "WHEWRD")); addFieldDescription(new ZonedDecimalFieldDescription(z40, "WHVCNE")); // Number of fields addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHNFLD")); addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHNIND")); addFieldDescription(new CharacterFieldDescription(txt1, "WHSHFT")); addFieldDescription(new CharacterFieldDescription(txt1, "WHALTY")); // ALIAS addFieldDescription(new CharacterFieldDescription(txt30, "WHALIS")); addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHJREF")); addFieldDescription(new ZonedDecimalFieldDescription(z20, "WHDFTL")); // Default value addFieldDescription(new CharacterFieldDescription(txt30, "WHDFT")); addFieldDescription(new CharacterFieldDescription(txt1, "WHCHRI")); addFieldDescription(new CharacterFieldDescription(txt1, "WHCTNT")); addFieldDescription(new CharacterFieldDescription(txt10, "WHFONT")); addFieldDescription(new ZonedDecimalFieldDescription(z31, "WHCSWD")); addFieldDescription(new ZonedDecimalFieldDescription(z31, "WHCSHI")); addFieldDescription(new CharacterFieldDescription(txt10, "WHBCNM")); addFieldDescription(new ZonedDecimalFieldDescription(z31, "WHBCHI")); addFieldDescription(new CharacterFieldDescription(txt1, "WHMAP")); addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHMAPS")); addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHMAPL")); addFieldDescription(new CharacterFieldDescription(txt8, "WHSYSN")); addFieldDescription(new CharacterFieldDescription(txt2, "WHRES1")); addFieldDescription(new CharacterFieldDescription(txt1, "WHSQLT")); addFieldDescription(new CharacterFieldDescription(txt1, "WHHEX")); addFieldDescription(new PackedDecimalFieldDescription(p41, "WHPNTS")); // CCSID addFieldDescription(new PackedDecimalFieldDescription(p50, "WHCCSID")); // Date/time format addFieldDescription(new CharacterFieldDescription(txt4, "WHFMT")); // Date/time separator addFieldDescription(new CharacterFieldDescription(txt1, "WHSEP")); // Variable length field addFieldDescription(new CharacterFieldDescription(txt1, "WHVARL")); addFieldDescription(new PackedDecimalFieldDescription(p50, "WHALLC")); // Allow null value addFieldDescription(new CharacterFieldDescription(txt1, "WHNULL")); addFieldDescription(new CharacterFieldDescription(txt10, "WHFCSN")); addFieldDescription(new CharacterFieldDescription(txt10, "WHFCSL")); addFieldDescription(new CharacterFieldDescription(txt10, "WHFCPN")); addFieldDescription(new CharacterFieldDescription(txt10, "WHFCPL")); addFieldDescription(new CharacterFieldDescription(txt10, "WHCDFN")); addFieldDescription(new CharacterFieldDescription(txt10, "WHCDFL")); addFieldDescription(new CharacterFieldDescription(txt10, "WHDCDF")); addFieldDescription(new CharacterFieldDescription(txt10, "WHDCDL")); addFieldDescription(new PackedDecimalFieldDescription(p30, "WHTXRT")); addFieldDescription(new ZonedDecimalFieldDescription(z50, "WHFLDG")); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy