com.ibm.as400.data.RfmlDocument Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400 Show documentation
Show all versions of jt400 Show documentation
The Open Source version of the IBM Toolbox for Java
The newest version!
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: RfmlDocument.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-2002 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.data;
import com.ibm.as400.access.AS400DataType;
import com.ibm.as400.access.AS400Text;
import com.ibm.as400.access.Record;
import com.ibm.as400.access.RecordFormat;
import com.ibm.as400.access.Trace;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.OutputStream;
import java.util.Enumeration;
/**
*/
class RfmlDocument extends PcmlDocument {
static final long serialVersionUID = 5L;
// New attributes should be added to the end of this array
private static final String RFML_ATTRIBUTES[] = {
"version", "ccsid"
};
private static final int DEFAULT_CCSID = 65535; // value to report if not explicitly set.
// Note: The following two variables represent the same value in two forms.
private String m_Ccsid; // null indicates "uninitialized"
private int m_CcsidInt; // zero indicates "uninitialized"
/**
*/
RfmlDocument(PcmlAttributeList attrs, String docName)
{
super(attrs,docName);
setNodeType(PcmlNodeType.RFML);
setCcsid(getAttributeValue("ccsid"));
}
/**
Returns the list of valid attributes for the element.
**/
String[] getAttributeList()
{
return RFML_ATTRIBUTES;
}
/**
Returns the ccsid= String value. If not set, returns null.
* @return ccsid
**/
public final String getCcsid()
{
return m_Ccsid;
}
/**
Returns the ccsid= integer literal value. If not set, returns 65535.
* @return ccsid
**/
public final int getCcsidInt()
{
if (m_CcsidInt == 0) return DEFAULT_CCSID; // if uninitialized, report default
else return m_CcsidInt;
}
/**
Overrides the implementation of the superclass (PcmlDocument).
**/
protected AS400DataType getConverter(int dataType, int dataLength, int dataPrecision, int ccsid, String dateFormat, String dateSeparator, String timeFormat, String timeSeparator)
throws PcmlException
{
if (dataType == PcmlData.CHAR)
{
// If the requested CCSID is not the same as
// the system's default host CCSID, always create
// a new converter. We only cache converters
// with CCSIDs that match the system object.
if (ccsid != m_CcsidInt)
{
return new AS400Text(dataLength, ccsid);
}
switch (dataLength)
{
case 1:
if (m_Text_1 == null)
{
m_Text_1 = new AS400Text(dataLength, ccsid);
}
return m_Text_1;
case 10:
if (m_Text_10 == null)
{
m_Text_10 = new AS400Text(dataLength, ccsid);
}
return m_Text_10;
default:
return new AS400Text(dataLength, ccsid);
}
}
else {
return super.getConverter(dataType, dataLength, dataPrecision, ccsid, dateFormat, dateSeparator, timeFormat, timeSeparator);
}
}
/**
Returns the value of the specified (numeric) field, as a "double".
**/
synchronized double getDoubleValue(String name) throws PcmlException
{
return getDoubleValue(name, new PcmlDimensions());
}
/**
Returns the value of the specified (numeric) field, as a "double".
**/
synchronized double getDoubleValue(String name, PcmlDimensions indices) throws PcmlException
{
Object value;
value = getValue(name, indices);
if (value == null)
{
throw new PcmlException(DAMRI.INPUT_VALUE_NOT_SET, new Object[] {name} );
}
else if (value instanceof String)
{
return Double.parseDouble((String) value); // Note: parseDouble() is new in Java2.
}
else if (value instanceof Number)
{
return ((Number) value).doubleValue();
}
else
{
throw new PcmlException(DAMRI.STRING_OR_NUMBER, new Object[] {value.getClass().getName(), name} );
}
}
/**
Returns a RfmlRecordFormat object representing the specified <recordformat> element.
**/
RfmlRecordFormat getRecordFormatNode(String formatName)
throws XmlException
{
PcmlNode node = getElement(formatName);
if (node instanceof RfmlRecordFormat)
{
return (RfmlRecordFormat) node;
}
else
{
if (node == null)
throw new XmlException(DAMRI.ELEMENT_NOT_FOUND, new Object[] {formatName, ""} );
else
throw new XmlException(DAMRI.WRONG_ELEMENT_TYPE, new Object[] {formatName, ""} );
}
}
/**
Sets the ccsid= attribute value.
**/
protected void setCcsid(String ccsid)
{
// Handle null or empty string
if (ccsid == null || ccsid.equals(""))
{
m_Ccsid = null;
m_CcsidInt = 0;
return;
}
// Try to parse an integer from the attribute value
try
{
m_Ccsid = ccsid;
m_CcsidInt = Integer.parseInt(ccsid);
}
// If value is not an integer, assume that it's an element name.
// checkAttributes() will be called later to verify the element name.
catch (NumberFormatException e)
{
m_Ccsid = null;
m_CcsidInt = 0;
}
}
/**
Generates XML (RFML) representing the data contained in this object.
Throws a runtime exception if this object contains no data.
@param outStream The output stream to which to write the text.
@exception IOException If an error occurs while writing the data.
@exception XmlException If an error occurs while processing RFML.
**/
public void toXml(OutputStream outStream)
throws IOException, XmlException
{
PrintWriter xmlFile = null;
try
{
xmlFile = new PrintWriter(outStream);
xmlFile.println(""); // @A1c
xmlFile.println("");
toXml(this, xmlFile, "");
if (xmlFile.checkError()) // Note: This flushes the stream.
{
Trace.log(Trace.ERROR, "Error when writing RFML to OutputStream.");
// Possible future enhancement: Throw an exception indicating IO error when writing RFML.
}
}
finally {
if (xmlFile != null) xmlFile.close(); // Note: close() flushes the stream first.
}
}
/**
Generates XML (RFML) representing the data contained in the specified node.
Throws a runtime exception if this object contains no data.
@param node The node to generate RFML for.
@param writer The writer to which to write the text.
@param indent The indentation with which to prepend the generated XML.
@exception IOException If an error occurs while writing the data.
@exception XmlException If an error occurs while processing RFML.
**/
private static void toXml(PcmlDocNode node, PrintWriter writer, String indent)
throws IOException, XmlException
{
// Start the start tag.
writer.print(indent + "<" + node.getTagName());
// Print out any attributes that have non-null values.
String[] attrs = node.getAttributeList();
for (int i=0; i");
// Step through each element, starting at the document root, and generate RFML for each element.
Enumeration children = node.getChildren();
while (children.hasMoreElements())
{
PcmlDocNode child = (PcmlDocNode) children.nextElement();
toXml(child, writer, indent+" ");
}
// Write the end tag.
writer.println(indent + "" + node.getTagName() + ">");
}
else {
// Finish the start tag.
writer.println("/>");
}
writer.flush();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy