oodt-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Ross Laidlaw (JIRA)" <j...@apache.org>
Subject [jira] [Created] (OODT-483) NumberFormatException when using RSS service to view transfers for large files
Date Mon, 06 Aug 2012 10:55:05 GMT
Ross Laidlaw created OODT-483:

             Summary: NumberFormatException when using RSS service to view transfers for large
                 Key: OODT-483
                 URL: https://issues.apache.org/jira/browse/OODT-483
             Project: OODT
          Issue Type: Bug
          Components: file manager
            Reporter: Ross Laidlaw
            Assignee: Ross Laidlaw
            Priority: Minor
             Fix For: 0.5

I used File Manager to ingest a large file and then attempted to view the progress of the
transfer using the 'cas-product' RSS web application (RSSProductTransferServlet [1]).  This
caused a NumberFormatException as follows:

java.lang.NumberFormatException: For input string: "11100111001101000000000000"

>From further testing I found that this exception occurs for files approximately 10MB in
size or larger.

This exception occurs because the XmlRpcStructFactory class is attempting to set the value
of a long variable using a binary representation (i.e. treating the binary number as a decimal
number).  The size of the binary representation exceeds the maximum capacity of the long because
it is not being converted to a decimal representation.

I traced the problem to the following methods in class XmlRpcStructFactory [2]:

public static Hashtable<String, Object> getXmlRpcFileTransferStatus(FileTransferStatus
  Hashtable<String, Object> statusHash = new Hashtable<String, Object>();
  statusHash.put("parentProduct", getXmlRpcProduct(status.getParentProduct()));
  statusHash.put("fileRef", getXmlRpcReference(status.getFileRef()));
  return statusHash;

public static FileTransferStatus getFileTransferStatusFromXmlRpc(Hashtable<String, Object>
  FileTransferStatus status = new FileTransferStatus();
  status.setParentProduct(getProductFromXmlRpc((Hashtable<String, Object>) statusHash.get("parentProduct")));
  status.setFileRef(getReferenceFromXmlRpc((Hashtable<String, Object>)
  return status;

In the getXmlRpcFileTransferStatus method shown above, the following line converts the value
returned by 'status.getBytesTransferred()' to a binary representation and stores it as a String
in the 'statusHash' Hashtable:

  statusHash.put("bytesTransferred", Long.toBinaryString(status.getBytesTransferred()));

But when the value is retrieved from statusHash in method getFileTransferStatusFromXmlRpc,
it isn't assumed to be a binary number:


For large files, the binary representation exceeds the capacity of a long.  In the example
above, the input string "11100111001101000000000000" converted directly to a long (i.e. treated
as a decimal) will exceed the maximum size of a long (9,223,372,036,854,775,807).

A simple fix for this would be to add a radix argument to Long.parseLong in method getFileTransferStatusFromXmlRpc,
as follows:


I tested this out on a large file (over 100MB) and it seemed to solve the problem.  Would
this be an acceptable fix?  I'll attach a patch to this issue for reference.

An alternative solution would be not to store a binary representation in the statusHash Hashtable.
 But I'm assuming there's a reason why it's converted to binary for the hash.  

[1] http://svn.apache.org/repos/asf/oodt/trunk/webapp/fmprod/src/main/java/org/apache/oodt/cas/product/rss/RSSProductTransferServlet.java
[2] http://svn.apache.org/repos/asf/oodt/trunk/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


View raw message