http://git-wip-us.apache.org/repos/asf/oodt/blob/fa572a2e/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManagerClient.java
----------------------------------------------------------------------
diff --cc 
filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManagerClient.java
index f76ddbc,5e84249..db64716
--- 
a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManagerClient.java
+++ 
b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManagerClient.java
@@@ -58,1276 -66,1326 +66,1326 @@@ import java.util.logging.Logger
   * @author mattmann (Chris Mattmann)
   * @author bfoster (Brian Foster)
   * @version $Revision$
-  * 
-  * <p>
-  * The XML RPC based file manager client.
-  * </p>
-  * 
+  *          <p/>
+  *          <p> The XML RPC based file manager client. </p>
   */
 -public class XmlRpcFileManagerClient {
 +public class XmlRpcFileManagerClient implements FileManagerClient {
  
-     /* our xml rpc client */
-     private XmlRpcClient client = null;
- 
-     /* our log stream */
-     private static Logger LOG = Logger.getLogger(XmlRpcFileManagerClient.class
-             .getName());
- 
-     /* file manager url */
-     private URL fileManagerUrl = null;
- 
-     /* data transferer needed if client is request to move files itself */
-     private DataTransfer dataTransfer = null;
- 
-     public XmlRpcFileManagerClient(final URL url) throws ConnectionException {
-        this(url, true);
-     }
- 
-     /**
-      * <p>
-      * Constructs a new XmlRpcFileManagerClient with the given 
<code>url</code>.
-      * </p>
-      *
-      * @param url
-      *            The url pointer to the xml rpc file manager service.
-      * @param testConnection
-      *            Whether or not to check if server at given url is alive.
-      */
-     public XmlRpcFileManagerClient(final URL url, boolean testConnection)
-           throws ConnectionException {
- 
-         XmlRpcTransportFactory transportFactory = new 
XmlRpcTransportFactory() {
- 
-             public XmlRpcTransport createTransport()
-                     throws XmlRpcClientException {
-                 HttpClient client = new HttpClient();
-                 
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
-                         new HttpMethodRetryHandler() {
- 
-                             public boolean retryMethod(HttpMethod method,
-                                     IOException e, int count) {
-                                 if (count < Integer
-                                         .getInteger(
-                                                 
"org.apache.oodt.cas.filemgr.system.xmlrpc.connection.retries",
-                                                 3).intValue()) {
-                                     try {
-                                         Thread
-                                                 .sleep(Integer
-                                                         .getInteger(
-                                                                 
"org.apache.oodt.cas.filemgr.system.xmlrpc.connection.retry.interval.seconds",
-                                                                 0).intValue() 
* 1000);
-                                         return true;
-                                     } catch (Exception e1) {
-                                     }
-                                 }
-                                 return false;
-                             }
- 
-                         });
-                 CommonsXmlRpcTransport transport = new CommonsXmlRpcTransport(
-                         url, client);
-                 transport
-                         .setConnectionTimeout(Integer
-                                 .getInteger(
-                                         
"org.apache.oodt.cas.filemgr.system.xmlrpc.connectionTimeout.minutes",
-                                         20).intValue() * 60 * 1000);
-                 transport
-                         .setTimeout(Integer
-                                 .getInteger(
-                                         
"org.apache.oodt.cas.filemgr.system.xmlrpc.requestTimeout.minutes",
-                                         60).intValue() * 60 * 1000);
- 
-                 return transport;
-             }
- 
-             public void setProperty(String arg0, Object arg1) {
-             }
- 
-         };
- 
-         client = new XmlRpcClient(url, transportFactory);
-         fileManagerUrl = url;
- 
-         if (testConnection && !isAlive()) {
-             throw new ConnectionException("Exception connecting to filemgr: ["
-                     + this.fileManagerUrl + "]");
-         }
- 
-     }
-     
-     public boolean refreshConfigAndPolicy() {
-       boolean success = false;
-   
-       Vector<Object> argList = new Vector<Object>();
-       try {
-         success = ((Boolean) client.execute("filemgr.refreshConfigAndPolicy",
-             argList)).booleanValue();
-       } catch (XmlRpcException e) {
-         LOG.log(Level.WARNING, "XmlRpcException when connecting to filemgr: ["
-             + this.fileManagerUrl + "]");
-         success = false;
-       } catch (IOException e) {
-         LOG.log(Level.WARNING, "IOException when connecting to filemgr: ["
-             + this.fileManagerUrl + "]");
-         success = false;
-       }
-   
-       return success;
-   }
- 
-     public boolean isAlive() {
-         boolean connected = false;
+   /* our xml rpc client */
+   private XmlRpcClient client = null;
  
-         Vector<Object> argList = new Vector<Object>();
-         try {
-             connected = ((Boolean) client.execute("filemgr.isAlive", argList))
-                     .booleanValue();
-         } catch (XmlRpcException e) {
-             LOG.log(Level.WARNING,
-                     "XmlRpcException when connecting to filemgr: ["
-                             + this.fileManagerUrl + "]");
-             connected = false;
-         } catch (IOException e) {
-             LOG.log(Level.WARNING, "IOException when connecting to filemgr: ["
-                     + this.fileManagerUrl + "]");
-             connected = false;
-         }
+   /* our log stream */
+   private static Logger LOG = Logger.getLogger(XmlRpcFileManagerClient.class
+       .getName());
  
-         return connected;
-     }
+   /* file manager url */
+   private URL fileManagerUrl = null;
  
-     public boolean transferringProduct(Product product)
-             throws DataTransferException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         argList.add(productHash);
+   /* data transferer needed if client is request to move files itself */
+   private DataTransfer dataTransfer = null;
  
-         boolean success = false;
+   public XmlRpcFileManagerClient(final URL url) throws ConnectionException {
+     this(url, true);
+   }
  
-         try {
-             success = ((Boolean) client.execute("filemgr.transferringProduct",
-                     argList)).booleanValue();
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
+   /**
+    * <p> Constructs a new XmlRpcFileManagerClient with the given 
<code>url</code>. </p>
+    *
+    * @param url            The url pointer to the xml rpc file manager 
service.
+    * @param testConnection Whether or not to check if server at given url is 
alive.
+    */
+   public XmlRpcFileManagerClient(final URL url, boolean testConnection)
+       throws ConnectionException {
+     // set up the configuration, if there is any
+     if (System.getProperty("org.apache.oodt.cas.filemgr.properties") != null) 
{
+       String configFile = System
+           .getProperty("org.apache.oodt.cas.filemgr.properties");
+       LOG.log(Level.INFO,
+           "Loading File Manager Configuration Properties from: ["
+           + configFile + "]");
+       try {
+         System.getProperties().load(
+             new FileInputStream(new File(configFile)));
+       } catch (Exception e) {
+         LOG.log(Level.INFO,
+             "Error loading configuration properties from: ["
+             + configFile + "]");
+       }
  
-         return success;
      }
  
-     public boolean removeProductTransferStatus(Product product)
-             throws DataTransferException {
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(productHash);
- 
-         boolean success = false;
+     XmlRpcTransportFactory transportFactory = new XmlRpcTransportFactory() {
  
-         try {
-             success = ((Boolean) client.execute(
-                     "filemgr.removeProductTransferStatus", argList))
-                     .booleanValue();
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
+       public XmlRpcTransport createTransport()
+           throws XmlRpcClientException {
+         HttpClient client = new HttpClient();
+         client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
+             new HttpMethodRetryHandler() {
  
-         return success;
-     }
+               public boolean retryMethod(HttpMethod method,
+                                          IOException e, int count) {
+                 if (count < Integer
+                     .getInteger(
+                         
"org.apache.oodt.cas.filemgr.system.xmlrpc.connection.retries",
+                         3)) {
+                   try {
+                     Thread
+                         .sleep(Integer
+                                    .getInteger(
+                                        
"org.apache.oodt.cas.filemgr.system.xmlrpc.connection.retry.interval.seconds",
+                                        0) * 1000);
+                     return true;
+                   } catch (Exception ignored) {
+                   }
+                 }
+                 return false;
+               }
+ 
+             });
+         CommonsXmlRpcTransport transport = new CommonsXmlRpcTransport(
+             url, client);
+         transport
+             .setConnectionTimeout(Integer
+                                       .getInteger(
+                                           
"org.apache.oodt.cas.filemgr.system.xmlrpc.connectionTimeout.minutes",
+                                           20) * 60 * 1000);
+         transport
+             .setTimeout(Integer
+                             .getInteger(
+                                 
"org.apache.oodt.cas.filemgr.system.xmlrpc.requestTimeout.minutes",
+                                 60) * 60 * 1000);
+ 
+         return transport;
+       }
  
-     public boolean isTransferComplete(Product product)
-             throws DataTransferException {
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(productHash);
+       public void setProperty(String arg0, Object arg1) {
+       }
  
-         boolean success = false;
+     };
  
-         try {
-             success = ((Boolean) client.execute("filemgr.isTransferComplete",
-                     argList)).booleanValue();
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
+     client = new XmlRpcClient(url, transportFactory);
+     fileManagerUrl = url;
  
-         return success;
+     if (testConnection && !isAlive()) {
+       throw new ConnectionException("Exception connecting to filemgr: ["
+                                     + this.fileManagerUrl + "]");
      }
  
-     public boolean moveProduct(Product product, String newPath)
-             throws DataTransferException {
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(productHash);
-         argList.add(newPath);
- 
-         boolean success = false;
+   }
  
-         try {
-             success = ((Boolean) client.execute("filemgr.moveProduct", 
argList))
-                     .booleanValue();
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
+   public boolean refreshConfigAndPolicy() {
+     boolean success;
  
-         return success;
+     Vector<Object> argList = new Vector<Object>();
+     try {
+       success = (Boolean) client.execute("filemgr.refreshConfigAndPolicy",
+           argList);
+     } catch (XmlRpcException e) {
+       LOG.log(Level.WARNING, "XmlRpcException when connecting to filemgr: ["
+                              + this.fileManagerUrl + "]");
+       success = false;
+     } catch (IOException e) {
+       LOG.log(Level.WARNING, "IOException when connecting to filemgr: ["
+                              + this.fileManagerUrl + "]");
+       success = false;
      }
  
-     public boolean modifyProduct(Product product) throws CatalogException {
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
- 
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(productHash);
- 
-         boolean success = false;
- 
-         try {
-             success = ((Boolean) client.execute("filemgr.modifyProduct",
-                     argList)).booleanValue();
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+     return success;
+   }
  
-         return success;
+   public boolean isAlive() {
+     boolean connected;
  
+     Vector<Object> argList = new Vector<Object>();
+     try {
+       connected = (Boolean) client.execute("filemgr.isAlive", argList);
+     } catch (XmlRpcException e) {
+       LOG.log(Level.WARNING,
+           "XmlRpcException when connecting to filemgr: ["
+           + this.fileManagerUrl + "]");
+       connected = false;
+     } catch (IOException e) {
+       LOG.log(Level.WARNING, "IOException when connecting to filemgr: ["
+                              + this.fileManagerUrl + "]");
+       connected = false;
      }
  
-     public boolean removeProduct(Product product) throws CatalogException {
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
- 
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(productHash);
- 
-         boolean success = false;
+     return connected;
+   }
  
-         try {
-             success = ((Boolean) client.execute("filemgr.removeProduct",
-                     argList)).booleanValue();
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+   public boolean transferringProduct(Product product)
+       throws DataTransferException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     argList.add(productHash);
  
-         return success;
+     boolean success;
  
+     try {
+       success = (Boolean) client.execute("filemgr.transferringProduct",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public FileTransferStatus getCurrentFileTransfer()
-             throws DataTransferException {
-         Vector<Object> argList = new Vector<Object>();
- 
-         Hashtable<String, Object> statusHash = null;
-         FileTransferStatus status = null;
+     return success;
+   }
  
-         try {
-             statusHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getCurrentFileTransfer", argList);
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
+   public boolean removeProductTransferStatus(Product product)
+       throws DataTransferException {
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(productHash);
  
-         if (statusHash != null) {
-             status = XmlRpcStructFactory
-                     .getFileTransferStatusFromXmlRpc(statusHash);
-         }
+     boolean success;
  
-         return status;
+     try {
+       success = (Boolean) client.execute(
+           "filemgr.removeProductTransferStatus", argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public List<FileTransferStatus> getCurrentFileTransfers()
-             throws DataTransferException {
-         Vector<Object> argList = new Vector<Object>();
- 
-         Vector<Hashtable<String, Object>> statusVector = null;
-         List<FileTransferStatus> statuses = null;
+     return success;
+   }
  
-         try {
-             statusVector = (Vector<Hashtable<String, Object>>) client.execute(
-                     "filemgr.getCurrentFileTransfers", argList);
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
+   public boolean isTransferComplete(Product product)
+       throws DataTransferException {
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(productHash);
  
-         if (statusVector != null) {
-             statuses = XmlRpcStructFactory
-                     .getFileTransferStatusesFromXmlRpc(statusVector);
-         }
+     boolean success;
  
-         return statuses;
+     try {
+       success = (Boolean) client.execute("filemgr.isTransferComplete",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
  
-     public double getProductPctTransferred(Product product)
-             throws DataTransferException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         argList.add(productHash);
-         Double pct = null;
+     return success;
+   }
  
-         try {
-             pct = (Double) client.execute("filemgr.getProductPctTransferred",
-                     argList);
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
+   public boolean moveProduct(Product product, String newPath)
+       throws DataTransferException {
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(productHash);
+     argList.add(newPath);
  
-         if (pct != null) {
-             return pct.doubleValue();
-         }
+     boolean success;
  
-         return -1.0;
+     try {
+       success = (Boolean) client.execute("filemgr.moveProduct", argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
  
-     public double getRefPctTransferred(Reference reference)
-             throws DataTransferException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> refHash = XmlRpcStructFactory
-                 .getXmlRpcReference(reference);
-         argList.add(refHash);
-         Double pct = null;
- 
-         try {
-             pct = (Double) client.execute("filemgr.getRefPctTransferred",
-                     argList);
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
- 
-         if (pct != null) {
-             return pct.doubleValue();
-         }
- 
-         return -1.0;
-     }
+     return success;
+   }
  
-     @SuppressWarnings("unchecked")
-     public ProductPage pagedQuery(Query query, ProductType type, int pageNum)
-             throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> queryHash = XmlRpcStructFactory
-                 .getXmlRpcQuery(query);
-         Hashtable<String, Object> typeHash = XmlRpcStructFactory
-                 .getXmlRpcProductType(type);
-         argList.add(queryHash);
-         argList.add(typeHash);
-         argList.add(new Integer(pageNum));
+   public boolean modifyProduct(Product product) throws CatalogException {
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
  
-         Hashtable<String, Object> pageHash = null;
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(productHash);
  
-         try {
-             pageHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.pagedQuery", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+     boolean success;
  
-         return XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
+     try {
+       success = (Boolean) client.execute("filemgr.modifyProduct",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public ProductPage getFirstPage(ProductType type) throws CatalogException 
{
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
+     return success;
  
-         ProductPage page = null;
-         Hashtable<String, Object> pageHash = null;
+   }
  
-         try {
-             pageHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getFirstPage", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+   public boolean removeProduct(Product product) throws CatalogException {
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
  
-         if (pageHash != null) {
-             page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
-         }
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(productHash);
  
-         return page;
+     boolean success;
  
+     try {
+       success = (Boolean) client.execute("filemgr.removeProduct",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public ProductPage getLastPage(ProductType type) throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
+     return success;
  
-         ProductPage page = null;
-         Hashtable<String, Object> pageHash = null;
+   }
  
-         try {
-             pageHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getLastPage", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+   @SuppressWarnings("unchecked")
+   public FileTransferStatus getCurrentFileTransfer()
+       throws DataTransferException {
+     Vector<Object> argList = new Vector<Object>();
  
-         if (pageHash != null) {
-             page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
-         }
+     Map<String, Object> statusHash;
+     FileTransferStatus status = null;
  
-         return page;
+     try {
+       statusHash = (Map<String, Object>) client.execute(
+           "filemgr.getCurrentFileTransfer", argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public ProductPage getNextPage(ProductType type, ProductPage currPage)
-             throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
-         argList.add(XmlRpcStructFactory.getXmlRpcProductPage(currPage));
+     if (statusHash != null) {
+       status = XmlRpcStructFactory
+           .getFileTransferStatusFromXmlRpc(statusHash);
+     }
  
-         ProductPage page = null;
-         Hashtable<String, Object> pageHash = null;
+     return status;
+   }
  
-         try {
-             pageHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getNextPage", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+   @SuppressWarnings("unchecked")
+   public List<FileTransferStatus> getCurrentFileTransfers()
+       throws DataTransferException {
+     Vector<Object> argList = new Vector<Object>();
  
-         if (pageHash != null) {
-             page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
-         }
+     Vector<Map<String, Object>> statusVector;
+     List<FileTransferStatus> statuses = null;
  
-         return page;
+     try {
+       statusVector = (Vector<Map<String, Object>>) client.execute(
+           "filemgr.getCurrentFileTransfers", argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public ProductPage getPrevPage(ProductType type, ProductPage currPage)
-             throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
-         argList.add(XmlRpcStructFactory.getXmlRpcProductPage(currPage));
- 
-         ProductPage page = null;
-         Hashtable<String, Object> pageHash = null;
+     if (statusVector != null) {
+       statuses = XmlRpcStructFactory
+           .getFileTransferStatusesFromXmlRpc(statusVector);
+     }
  
-         try {
-             pageHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getPrevPage", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+     return statuses;
+   }
  
-         if (pageHash != null) {
-             page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
-         }
+   public double getProductPctTransferred(Product product)
+       throws DataTransferException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     argList.add(productHash);
+     Double pct;
  
-         return page;
+     try {
+       pct = (Double) client.execute("filemgr.getProductPctTransferred",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
  
-     public String addProductType(ProductType type)
-             throws RepositoryManagerException {
-         String productTypeId = null;
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> typeHash = XmlRpcStructFactory
-                 .getXmlRpcProductType(type);
-         argList.add(typeHash);
+     if (pct != null) {
+       return pct;
+     }
  
-         try {
-             productTypeId = (String) client.execute("filemgr.addProductType",
-                     argList);
-         } catch (XmlRpcException e) {
-             throw new RepositoryManagerException(e.getMessage());
-         } catch (IOException e) {
-             throw new RepositoryManagerException(e.getMessage());
-         }
+     return -1.0;
+   }
  
-         return productTypeId;
+   public double getRefPctTransferred(Reference reference)
+       throws DataTransferException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> refHash = XmlRpcStructFactory
+         .getXmlRpcReference(reference);
+     argList.add(refHash);
+     Double pct;
  
+     try {
+       pct = (Double) client.execute("filemgr.getRefPctTransferred",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
  
-     public boolean hasProduct(String productName) throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(productName);
+     if (pct != null) {
+       return pct;
+     }
  
-         boolean hasProduct = false;
+     return -1.0;
+   }
  
-         try {
-             hasProduct = ((Boolean) client.execute("filemgr.hasProduct",
-                     argList)).booleanValue();
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+   @SuppressWarnings("unchecked")
+   public ProductPage pagedQuery(Query query, ProductType type, int pageNum)
+       throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> queryHash = XmlRpcStructFactory
+         .getXmlRpcQuery(query);
+     Map<String, Object> typeHash = XmlRpcStructFactory
+         .getXmlRpcProductType(type);
+     argList.add(queryHash);
+     argList.add(typeHash);
+     argList.add(pageNum);
  
-         return hasProduct;
+     Map<String, Object> pageHash;
  
+     try {
+       pageHash = (Map<String, Object>) client.execute(
+           "filemgr.pagedQuery", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     public int getNumProducts(ProductType type) throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
+     return XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
+   }
  
-         Integer numProducts = new Integer(-1);
+   @SuppressWarnings("unchecked")
+   public ProductPage getFirstPage(ProductType type) throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
  
-         try {
-             numProducts = (Integer) client.execute("filemgr.getNumProducts",
-                     argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+     ProductPage page = null;
+     Map<String, Object> pageHash;
  
-         return numProducts.intValue();
+     try {
+       pageHash = (Map<String, Object>) client.execute(
+           "filemgr.getFirstPage", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public List<Product> getTopNProducts(int n) throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(new Integer(n));
- 
-         Vector<Hashtable<String, Object>> topNProducts = null;
- 
-         try {
-             topNProducts = (Vector<Hashtable<String, Object>>) client.execute(
-                     "filemgr.getTopNProducts", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
- 
-         List<Product> topNProductList = XmlRpcStructFactory
-                 .getProductListFromXmlRpc(topNProducts);
-         return topNProductList;
+     if (pageHash != null) {
+       page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
      }
  
+     return page;
  
-     @SuppressWarnings("unchecked")
-     public List<Product> getTopNProducts(int n, ProductType type)
-             throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(new Integer(n));
-         Hashtable<String, Object> productTypeHash = XmlRpcStructFactory
-                 .getXmlRpcProductType(type);
-         argList.add(productTypeHash);
+   }
  
-         Vector<Hashtable<String, Object>> topNProducts = null;
+   @SuppressWarnings("unchecked")
+   public ProductPage getLastPage(ProductType type) throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
  
-         try {
-             topNProducts = (Vector<Hashtable<String, Object>>) client.execute(
-                     "filemgr.getTopNProducts", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+     ProductPage page = null;
+     Map<String, Object> pageHash;
  
-         List<Product> topNProductList = XmlRpcStructFactory
-                 .getProductListFromXmlRpc(topNProducts);
-         return topNProductList;
+     try {
+       pageHash = (Map<String, Object>) client.execute(
+           "filemgr.getLastPage", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     public void setProductTransferStatus(Product product)
-             throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         argList.add(productHash);
- 
-         try {
-             client.execute("filemgr.setProductTransferStatus", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
- 
+     if (pageHash != null) {
+       page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
      }
  
-     public void addProductReferences(Product product) throws CatalogException 
{
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         argList.add(productHash);
- 
-         try {
-             client.execute("filemgr.addProductReferences", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
-     }
+     return page;
+   }
  
-   public void addMetadata(Product product, Metadata metadata)
+   @SuppressWarnings("unchecked")
+   public ProductPage getNextPage(ProductType type, ProductPage currPage)
        throws CatalogException {
- 
      Vector<Object> argList = new Vector<Object>();
-     argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
-     argList.add(metadata.getHashtable());
+     argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
+     argList.add(XmlRpcStructFactory.getXmlRpcProductPage(currPage));
+ 
+     ProductPage page = null;
+     Map<String, Object> pageHash;
  
      try {
-       client.execute("filemgr.addMetadata", argList);
+       pageHash = (Map<String, Object>) client.execute(
+           "filemgr.getNextPage", argList);
      } catch (XmlRpcException e) {
-       throw new CatalogException(e.getMessage());
+       throw new CatalogException(e);
      } catch (IOException e) {
-       throw new CatalogException(e.getMessage());
+       throw new CatalogException(e);
+     }
+ 
+     if (pageHash != null) {
+       page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
      }
+ 
+     return page;
    }
  
-   public boolean updateMetadata(Product product, Metadata met)
+   @SuppressWarnings("unchecked")
+   public ProductPage getPrevPage(ProductType type, ProductPage currPage)
        throws CatalogException {
      Vector<Object> argList = new Vector<Object>();
-     argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
-     argList.add(met.getHashtable());
+     argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
+     argList.add(XmlRpcStructFactory.getXmlRpcProductPage(currPage));
  
-     boolean result = false;
+     ProductPage page = null;
+     Map<String, Object> pageHash;
  
      try {
-       result = (Boolean) client.execute("filemgr.updateMetadata", argList);
+       pageHash = (Map<String, Object>) client.execute(
+           "filemgr.getPrevPage", argList);
      } catch (XmlRpcException e) {
-       throw new CatalogException(e.getMessage());
+       throw new CatalogException(e);
      } catch (IOException e) {
-       throw new CatalogException(e.getMessage());
+       throw new CatalogException(e);
      }
  
-     return result;
+     if (pageHash != null) {
+       page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
+     }
  
+     return page;
    }
  
-     public String catalogProduct(Product product) throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
+   public String addProductType(ProductType type)
+       throws RepositoryManagerException {
+     String productTypeId;
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> typeHash = XmlRpcStructFactory
+         .getXmlRpcProductType(type);
+     argList.add(typeHash);
  
-         String productId = null;
+     try {
+       productTypeId = (String) client.execute("filemgr.addProductType",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new RepositoryManagerException(e);
+     } catch (IOException e) {
+       throw new RepositoryManagerException(e);
+     }
  
-         try {
-             productId = (String) client.execute("filemgr.catalogProduct",
-                     argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+     return productTypeId;
  
-         return productId;
+   }
+ 
+   public boolean hasProduct(String productName) throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(productName);
+ 
+     boolean hasProduct;
+ 
+     try {
+       hasProduct = (Boolean) client.execute("filemgr.hasProduct",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public Metadata getMetadata(Product product) throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         argList.add(productHash);
+     return hasProduct;
  
-         Hashtable<String, Object> metadata = null;
+   }
  
-         try {
-             metadata = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getMetadata", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+   public int getNumProducts(ProductType type) throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
  
-         Metadata m = new Metadata();
-         m.addMetadata(metadata);
-         return m;
+     Integer numProducts;
  
+     try {
+       numProducts = (Integer) client.execute("filemgr.getNumProducts",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings({ "unchecked", "rawtypes" })
-     public Metadata getReducedMetadata(Product product, List<?> elements)
-             throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         argList.add(productHash);
-         argList.add(new Vector(elements));
- 
-         Hashtable<String, Object> metadata = null;
+     return numProducts;
+   }
  
-         try {
-             metadata = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getReducedMetadata", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+   @SuppressWarnings("unchecked")
+   public List<Product> getTopNProducts(int n) throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(n);
  
-         Metadata m = new Metadata();
-         m.addMetadata(metadata);
-         return m;
+     Vector<Map<String, Object>> topNProducts;
  
+     try {
+       topNProducts = (Vector<Map<String, Object>>) client.execute(
+           "filemgr.getTopNProducts", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     public boolean removeFile(String filePath) throws DataTransferException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(filePath);
+     return XmlRpcStructFactory
+         .getProductListFromXmlRpc(topNProducts);
+   }
  
-         boolean success = false;
+   @SuppressWarnings("unchecked")
+   public List<Product> getTopNProducts(int n, ProductType type)
+       throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(n);
+     Map<String, Object> productTypeHash = XmlRpcStructFactory
+         .getXmlRpcProductType(type);
+     argList.add(productTypeHash);
  
-         try {
-             success = ((Boolean) client.execute("filemgr.removeFile", 
argList))
-                     .booleanValue();
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
+     Vector<Map<String, Object>> topNProducts;
  
-         return success;
+     try {
+       topNProducts = (Vector<Map<String, Object>>) client.execute(
+           "filemgr.getTopNProducts", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-    public byte[] retrieveFile(String filePath, int offset, int numBytes)
-          throws DataTransferException {
-       Vector<Object> argList = new Vector<Object>();
-       argList.add(filePath);
-       argList.add(new Integer(offset));
-       argList.add(new Integer(numBytes));
+     return XmlRpcStructFactory
+         .getProductListFromXmlRpc(topNProducts);
+   }
  
-       try {
-          return (byte[]) client.execute("filemgr.retrieveFile", argList);
-       } catch (XmlRpcException e) {
-          throw new DataTransferException(e.getMessage());
-       } catch (IOException e) {
-          throw new DataTransferException(e.getMessage());
-       }
-    }
+   public void setProductTransferStatus(Product product)
+       throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     argList.add(productHash);
  
-     public void transferFile(String filePath, byte[] fileData, int offset,
-             int numBytes) throws DataTransferException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(filePath);
-         argList.add(fileData);
-         argList.add(new Integer(offset));
-         argList.add(new Integer(numBytes));
+     try {
+       client.execute("filemgr.setProductTransferStatus", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
+     }
  
-         try {
-             client.execute("filemgr.transferFile", argList);
-         } catch (XmlRpcException e) {
-             throw new DataTransferException(e.getMessage());
-         } catch (IOException e) {
-             throw new DataTransferException(e.getMessage());
-         }
+   }
+ 
+   public void addProductReferences(Product product) throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     argList.add(productHash);
+ 
+     try {
+       client.execute("filemgr.addProductReferences", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
+   }
  
-     @SuppressWarnings("unchecked")
-     public List<Product> getProductsByProductType(ProductType type)
-             throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> productTypeHash = XmlRpcStructFactory
-                 .getXmlRpcProductType(type);
-         argList.add(productTypeHash);
+   public void addMetadata(Product product, Metadata metadata)
+       throws CatalogException {
  
-         Vector<Hashtable<String, Object>> productVector = null;
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
+     argList.add(metadata.getHashTable());
  
-         try {
-             productVector = (Vector<Hashtable<String, Object>>) 
client.execute(
-                     "filemgr.getProductsByProductType", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+     try {
+       client.execute("filemgr.addMetadata", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
+     }
+   }
  
-         if (productVector == null) {
-             return null;
-         } else {
-             return 
XmlRpcStructFactory.getProductListFromXmlRpc(productVector);
-         }
+   public boolean updateMetadata(Product product, Metadata met)
+       throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
+     argList.add(met.getHashTable());
+ 
+     boolean result;
+ 
+     try {
+       result = (Boolean) client.execute("filemgr.updateMetadata", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public List<Element> getElementsByProductType(ProductType type)
-             throws ValidationLayerException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> productTypeHash = XmlRpcStructFactory
-                 .getXmlRpcProductType(type);
+     return result;
  
-         argList.add(productTypeHash);
+   }
  
-         Vector<Hashtable<String, Object>> elementVector = null;
+   public String catalogProduct(Product product) throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
  
-         try {
-             elementVector = (Vector<Hashtable<String, Object>>) 
client.execute(
-                     "filemgr.getElementsByProductType", argList);
-         } catch (XmlRpcException e) {
-             throw new ValidationLayerException(e.getMessage());
-         } catch (IOException e) {
-             throw new ValidationLayerException(e.getMessage());
-         }
+     String productId;
  
-         if (elementVector == null) {
-             return null;
-         } else {
-             return 
XmlRpcStructFactory.getElementListFromXmlRpc(elementVector);
-         }
+     try {
+       productId = (String) client.execute("filemgr.catalogProduct",
+           argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public Element getElementById(String elementId)
-             throws ValidationLayerException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(elementId);
+     return productId;
+   }
  
-         Hashtable<String, Object> elementHash = null;
+   @SuppressWarnings("unchecked")
+   public Metadata getMetadata(Product product) throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     argList.add(productHash);
  
-         try {
-             elementHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getElementById", argList);
-         } catch (XmlRpcException e) {
-             throw new ValidationLayerException(e.getMessage());
-         } catch (IOException e) {
-             throw new ValidationLayerException(e.getMessage());
-         }
+     Map<String, Object> metadata;
  
-         if (elementHash == null) {
-             return null;
-         } else {
-             return XmlRpcStructFactory.getElementFromXmlRpc(elementHash);
-         }
+     try {
+       metadata = (Map<String, Object>) client.execute(
+           "filemgr.getMetadata", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public Element getElementByName(String elementName)
-             throws ValidationLayerException {
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(elementName);
+     Metadata m = new Metadata();
+     m.addMetadata(metadata);
+     return m;
  
-         Hashtable<String, Object> elementHash = null;
+   }
  
-         try {
-             elementHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getElementByName", argList);
-         } catch (XmlRpcException e) {
-             throw new ValidationLayerException(e.getMessage());
-         } catch (IOException e) {
-             throw new ValidationLayerException(e.getMessage());
-         }
+   @SuppressWarnings({ "unchecked", "rawtypes" })
+   public Metadata getReducedMetadata(Product product, List<?> elements)
+       throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     argList.add(productHash);
+     argList.add(new Vector(elements));
  
-         if (elementHash == null) {
-             return null;
-         } else {
-             return XmlRpcStructFactory.getElementFromXmlRpc(elementHash);
-         }
+     Map<String, Object> metadata;
+ 
+     try {
+       metadata = (Map<String, Object>) client.execute(
+           "filemgr.getReducedMetadata", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     public List<QueryResult> complexQuery(ComplexQuery complexQuery)
-             throws CatalogException {
-         try {
-             Hashtable<String, Object> complexQueryHash = XmlRpcStructFactory
-                     .getXmlRpcComplexQuery(complexQuery);
-             Vector<Object> argList = new Vector<Object>();
-             argList.add(complexQueryHash);
-             @SuppressWarnings("unchecked")
-             Vector<Hashtable<String, Object>> queryResultHashVector = 
(Vector<Hashtable<String, Object>>) client
-                     .execute("filemgr.complexQuery", argList);
-             return XmlRpcStructFactory
-                     .getQueryResultsFromXmlRpc(queryResultHashVector);
-         } catch (Exception e) {
-             e.printStackTrace();
-             throw new CatalogException(e.getMessage());
-         }
+     Metadata m = new Metadata();
+     m.addMetadata(metadata);
+     return m;
+ 
+   }
+ 
+   public boolean removeFile(String filePath) throws DataTransferException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(filePath);
+ 
+     boolean success;
+ 
+     try {
+       success = (Boolean) client.execute("filemgr.removeFile", argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public List<Product> query(Query query, ProductType type)
-             throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
-         Hashtable<String, Object> queryHash = XmlRpcStructFactory
-                 .getXmlRpcQuery(query);
-         Hashtable<String, Object> typeHash = XmlRpcStructFactory
-                 .getXmlRpcProductType(type);
-         argList.add(queryHash);
-         argList.add(typeHash);
+     return success;
+   }
  
-         Vector<Hashtable<String, Object>> productVector = null;
+   public byte[] retrieveFile(String filePath, int offset, int numBytes)
+       throws DataTransferException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(filePath);
+     argList.add(offset);
+     argList.add(numBytes);
  
-         try {
-             productVector = (Vector<Hashtable<String, Object>>) 
client.execute(
-                     "filemgr.query", argList);
-         } catch (XmlRpcException e) {
-             e.printStackTrace();
-             throw new CatalogException(e.getMessage());
- 
-         } catch (IOException e) {
-             e.printStackTrace();
-             throw new CatalogException(e.getMessage());
-         }
+     try {
+       return (byte[]) client.execute("filemgr.retrieveFile", argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
+     }
+   }
  
-         if (productVector == null) {
-             return null;
-         } else {
-             return 
XmlRpcStructFactory.getProductListFromXmlRpc(productVector);
-         }
+   public void transferFile(String filePath, byte[] fileData, int offset,
+                            int numBytes) throws DataTransferException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(filePath);
+     argList.add(fileData);
+     argList.add(offset);
+     argList.add(numBytes);
+ 
+     try {
+       client.execute("filemgr.transferFile", argList);
+     } catch (XmlRpcException e) {
+       throw new DataTransferException(e);
+     } catch (IOException e) {
+       throw new DataTransferException(e);
      }
+   }
  
-     @SuppressWarnings("unchecked")
-     public ProductType getProductTypeByName(String productTypeName)
-             throws RepositoryManagerException {
-         Hashtable<String, Object> productTypeHash = new Hashtable<String, 
Object>();
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(productTypeName);
+   @SuppressWarnings("unchecked")
+   public List<Product> getProductsByProductType(ProductType type)
+       throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> productTypeHash = XmlRpcStructFactory
+         .getXmlRpcProductType(type);
+     argList.add(productTypeHash);
  
-         try {
-             productTypeHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getProductTypeByName", argList);
-         } catch (XmlRpcException e) {
-             throw new RepositoryManagerException(e.getLocalizedMessage());
-         } catch (IOException e) {
-             throw new RepositoryManagerException(e.getMessage());
-         }
+     Vector<Map<String, Object>> productVector;
  
-         if (productTypeHash == null) {
-             return null;
-         } else
-             return XmlRpcStructFactory
-                     .getProductTypeFromXmlRpc(productTypeHash);
+     try {
+       productVector = (Vector<Map<String, Object>>) client.execute(
+           "filemgr.getProductsByProductType", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public ProductType getProductTypeById(String productTypeId)
-             throws RepositoryManagerException {
-         Hashtable<String, Object> productTypeHash = new Hashtable<String, 
Object>();
-         Vector<Object> argList = new Vector<Object>();
-         argList.add(productTypeId);
+     if (productVector == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory.getProductListFromXmlRpc(productVector);
+     }
+   }
  
-         try {
-             productTypeHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getProductTypeById", argList);
-         } catch (XmlRpcException e) {
-             throw new RepositoryManagerException(e.getMessage());
-         } catch (IOException e) {
-             throw new RepositoryManagerException(e.getMessage());
-         }
+   @SuppressWarnings("unchecked")
+   public List<Element> getElementsByProductType(ProductType type)
+       throws ValidationLayerException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> productTypeHash = XmlRpcStructFactory
+         .getXmlRpcProductType(type);
  
-         if (productTypeHash == null) {
-             return null;
-         } else
-             return XmlRpcStructFactory
-                     .getProductTypeFromXmlRpc(productTypeHash);
+     argList.add(productTypeHash);
+ 
+     Vector<Map<String, Object>> elementVector;
+ 
+     try {
+       elementVector = (Vector<Map<String, Object>>) client.execute(
+           "filemgr.getElementsByProductType", argList);
+     } catch (XmlRpcException e) {
+       throw new ValidationLayerException(e);
+     } catch (IOException e) {
+       throw new ValidationLayerException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public List<ProductType> getProductTypes()
-             throws RepositoryManagerException {
-         Vector<Object> argList = new Vector<Object>();
+     if (elementVector == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory.getElementListFromXmlRpc(elementVector);
+     }
+   }
  
-         Vector<Hashtable<String, Object>> productTypeVector = null;
+   @SuppressWarnings("unchecked")
+   public Element getElementById(String elementId)
+       throws ValidationLayerException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(elementId);
  
-         try {
-             productTypeVector = (Vector<Hashtable<String, Object>>) client
-                     .execute("filemgr.getProductTypes", argList);
-         } catch (XmlRpcException e) {
-             throw new RepositoryManagerException(e.getMessage());
-         } catch (IOException e) {
-             throw new RepositoryManagerException(e.getMessage());
-         }
+     Hashtable<String, Object> elementHash;
  
-         if (productTypeVector == null) {
-             return null;
-         } else {
-             return XmlRpcStructFactory
-                     .getProductTypeListFromXmlRpc(productTypeVector);
-         }
+     try {
+       elementHash = (Hashtable<String, Object>) client.execute(
+           "filemgr.getElementById", argList);
+     } catch (XmlRpcException e) {
+       throw new ValidationLayerException(e);
+     } catch (IOException e) {
+       throw new ValidationLayerException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public List<Reference> getProductReferences(Product product)
-             throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
+     if (elementHash == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory.getElementFromXmlRpc(elementHash);
+     }
+   }
  
-         Vector<Hashtable<String, Object>> productReferenceVector = null;
-         Hashtable<String, Object> productHash = XmlRpcStructFactory
-                 .getXmlRpcProduct(product);
-         argList.add(productHash);
+   @SuppressWarnings("unchecked")
+   public Element getElementByName(String elementName)
+       throws ValidationLayerException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(elementName);
  
-         try {
-             productReferenceVector = (Vector<Hashtable<String, Object>>) 
client
-                     .execute("filemgr.getProductReferences", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+     Hashtable<String, Object> elementHash;
  
-         if (productReferenceVector == null) {
-             return null;
-         } else {
-             return XmlRpcStructFactory
-                     .getReferencesFromXmlRpc(productReferenceVector);
-         }
+     try {
+       elementHash = (Hashtable<String, Object>) client.execute(
+           "filemgr.getElementByName", argList);
+     } catch (XmlRpcException e) {
+       throw new ValidationLayerException(e);
+     } catch (IOException e) {
+       throw new ValidationLayerException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public Product getProductById(String productId) throws CatalogException {
-         Vector<Object> argList = new Vector<Object>();
+     if (elementHash == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory.getElementFromXmlRpc(elementHash);
+     }
+   }
  
-         Hashtable<String, Object> productHash = null;
-         argList.add(productId);
+   @SuppressWarnings("unchecked")
+   public Element getElementByName(String elementName, ProductType type)
+       throws ValidationLayerException {
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(elementName);
+     argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
  
-         try {
-             productHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getProductById", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+     Hashtable<String, Object> elementHash;
  
-         if (productHash == null) {
-             return null;
-         } else {
-             return XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-         }
+     try {
+       elementHash = (Hashtable<String, Object>) client.execute(
+           "filemgr.getElementByName", argList);
+     } catch (XmlRpcException e) {
+       throw new ValidationLayerException(e);
+     } catch (IOException e) {
+       throw new ValidationLayerException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public Product getProductByName(String productName) throws 
CatalogException {
-         Vector<Object> argList = new Vector<Object>();
+     if (elementHash == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory.getElementFromXmlRpc(elementHash);
+     }
+   }
  
-         Hashtable<String, Object> productHash = null;
-         argList.add(productName);
+   public List<QueryResult> complexQuery(ComplexQuery complexQuery)
+       throws CatalogException {
+     try {
+       Map<String, Object> complexQueryHash = XmlRpcStructFactory
+           .getXmlRpcComplexQuery(complexQuery);
+       Vector<Object> argList = new Vector<Object>();
+       argList.add(complexQueryHash);
+       @SuppressWarnings("unchecked")
+       Vector<Map<String, Object>> queryResultHashVector = (Vector<Map<String, 
Object>>) client
+           .execute("filemgr.complexQuery", argList);
+       return XmlRpcStructFactory
+           .getQueryResultsFromXmlRpc(queryResultHashVector);
+     } catch (Exception e) {
+       LOG.log(Level.SEVERE, e.getMessage());
+       throw new CatalogException(e);
+     }
+   }
  
-         try {
-             productHash = (Hashtable<String, Object>) client.execute(
-                     "filemgr.getProductByName", argList);
-         } catch (XmlRpcException e) {
-             throw new CatalogException(e.getMessage());
-         } catch (IOException e) {
-             throw new CatalogException(e.getMessage());
-         }
+   @SuppressWarnings("unchecked")
+   public List<Product> query(Query query, ProductType type)
+       throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+     Map<String, Object> queryHash = XmlRpcStructFactory
+         .getXmlRpcQuery(query);
+     Map<String, Object> typeHash = XmlRpcStructFactory
+         .getXmlRpcProductType(type);
+     argList.add(queryHash);
+     argList.add(typeHash);
  
-         if (productHash == null) {
-             return null;
-         } else {
-             return XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-         }
+     Vector<Map<String, Object>> productVector;
+ 
+     try {
+       productVector = (Vector<Map<String, Object>>) client.execute(
+           "filemgr.query", argList);
+     } catch (XmlRpcException e) {
+       LOG.log(Level.SEVERE, e.getMessage());
+       throw new CatalogException(e);
+ 
+     } catch (IOException e) {
+       LOG.log(Level.SEVERE, e.getMessage());
+       throw new CatalogException(e);
      }
  
-     public String ingestProduct(Product product, Metadata metadata,
-             boolean clientTransfer) throws Exception {
-         try {
-             // ingest product
-             Vector<Object> argList = new Vector<Object>();
-             Hashtable<String, Object> productHash = XmlRpcStructFactory
-                     .getXmlRpcProduct(product);
-             argList.add(productHash);
-             argList.add(metadata.getHashtable());
-             argList.add(Boolean.valueOf(clientTransfer));
-             String productId = (String) 
client.execute("filemgr.ingestProduct",
-                     argList);
- 
-             if (clientTransfer) {
-                 LOG.log(Level.FINEST,
-                         "File Manager Client: clientTransfer enabled: "
-                                 + "transfering product ["
-                                 + product.getProductName() + "]");
- 
-                 // we need to transfer the product ourselves
-                 // make sure we have the product ID
-                 if (productId == null) {
-                     throw new Exception("Request to ingest product: "
-                             + product.getProductName()
-                             + " but no product ID returned from File "
-                             + "Manager ingest");
-                 }
+     if (productVector == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory.getProductListFromXmlRpc(productVector);
+     }
+   }
  
-                 if (dataTransfer == null) {
-                     throw new Exception("Request to ingest product: ["
-                             + product.getProductName()
-                             + "] using client transfer, but no "
-                             + "dataTransferer specified!");
-                 }
+   @SuppressWarnings("unchecked")
+   public ProductType getProductTypeByName(String productTypeName)
+       throws RepositoryManagerException {
+     Hashtable<String, Object> productTypeHash;
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(productTypeName);
  
-                 product.setProductId(productId);
+     try {
+       productTypeHash = (Hashtable<String, Object>) client.execute(
+           "filemgr.getProductTypeByName", argList);
+     } catch (XmlRpcException e) {
+       throw new RepositoryManagerException(e.getLocalizedMessage());
+     } catch (IOException e) {
+       throw new RepositoryManagerException(e);
+     }
  
-                 if 
(!Boolean.getBoolean("org.apache.oodt.cas.filemgr.serverside.versioning")) {
-                   // version the product
-                   Versioner versioner = GenericFileManagerObjectFactory
-                           .getVersionerFromClassName(product.getProductType()
-                                   .getVersioner());
-                   versioner.createDataStoreReferences(product, metadata);
-                   
-                   // add the newly versioned references to the data store
-                   try {
-                       addProductReferences(product);
-                   } catch (CatalogException e) {
-                       LOG
-                               .log(
-                                       Level.SEVERE,
-                                       "ingestProduct: 
RepositoryManagerException "
-                                               + "when adding Product 
References for Product : "
-                                               + product.getProductName()
-                                               + " to RepositoryManager: 
Message: "
-                                               + e.getMessage());
-                       throw e;
-                   }
-                 } else {
-                   product.setProductReferences(getProductReferences(product));
-                 }
-                 
-                 // now transfer the product
-                 try {
-                     dataTransfer.transferProduct(product);
-                     // now update the product's transfer status in the data
-                     // store
-                     product.setTransferStatus(Product.STATUS_RECEIVED);
- 
-                     try {
-                         setProductTransferStatus(product);
-                     } catch (CatalogException e) {
-                         LOG
-                                 .log(
-                                         Level.SEVERE,
-                                         "ingestProduct: 
RepositoryManagerException "
-                                                 + "when updating product 
transfer status for Product: "
-                                                 + product.getProductName()
-                                                 + " Message: " + 
e.getMessage());
-                         throw e;
-                     }
-                 } catch (Exception e) {
-                     LOG.log(Level.SEVERE,
-                             "ingestProduct: DataTransferException when 
transfering Product: "
-                                     + product.getProductName() + ": Message: "
-                                     + e.getMessage());
-                     throw new DataTransferException(e);
-                 }
+     if (productTypeHash == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory
+           .getProductTypeFromXmlRpc(productTypeHash);
+     }
+   }
  
-             }
-             return productId;
- 
-             // error versioning file
-         } catch (VersioningException e) {
-             e.printStackTrace();
-             LOG.log(Level.SEVERE,
-                 "ingestProduct: VersioningException when versioning Product: "
-                         + product.getProductName() + " with Versioner "
-                         + product.getProductType().getVersioner()
-                         + ": Message: " + e.getMessage());
-             throw new VersioningException(e);
-         } catch (Exception e) {
-             e.printStackTrace();
-             LOG.log(Level.SEVERE, "Failed to ingest product [" + product
-                     + "] : " + e.getMessage() + " -- rolling back ingest");
-             try {
-                 Vector<Object> argList = new Vector<Object>();
-                 Hashtable<String, Object> productHash = XmlRpcStructFactory
-                         .getXmlRpcProduct(product);
-                 argList.add(productHash);
-                 client.execute("filemgr.removeProduct", argList);
-             } catch (Exception e1) {
-                 LOG.log(Level.SEVERE, "Failed to rollback ingest of product ["
-                         + product + "] : " + e.getMessage());
-             }
-             throw new Exception("Failed to ingest product [" + product + "] : 
"
-                     + e.getMessage());
-         }
+   @SuppressWarnings("unchecked")
+   public ProductType getProductTypeById(String productTypeId)
+       throws RepositoryManagerException {
+     Hashtable<String, Object> productTypeHash;
+     Vector<Object> argList = new Vector<Object>();
+     argList.add(productTypeId);
  
+     try {
+       productTypeHash = (Hashtable<String, Object>) client.execute(
+           "filemgr.getProductTypeById", argList);
+     } catch (XmlRpcException e) {
+       throw new RepositoryManagerException(e);
+     } catch (IOException e) {
+       throw new RepositoryManagerException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public Metadata getCatalogValues(Metadata metadata, ProductType 
productType)
-             throws XmlRpcException, IOException {
-         Vector<Object> args = new Vector<Object>();
-         args.add(metadata.getHashtable());
-         args.add(XmlRpcStructFactory.getXmlRpcProductType(productType));
+     if (productTypeHash == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory
+           .getProductTypeFromXmlRpc(productTypeHash);
+     }
+   }
  
-         Metadata m = new Metadata();
-         m.addMetadata((Hashtable<String, Object>) this.client.execute(
-                 "filemgr.getCatalogValues", args));
+   @SuppressWarnings("unchecked")
+   public List<ProductType> getProductTypes()
+       throws RepositoryManagerException {
+     Vector<Object> argList = new Vector<Object>();
+ 
+     Vector<Map<String, Object>> productTypeVector;
  
-         return m;
+     try {
+       productTypeVector = (Vector<Map<String, Object>>) client
+           .execute("filemgr.getProductTypes", argList);
+     } catch (XmlRpcException e) {
+       throw new RepositoryManagerException(e);
+     } catch (IOException e) {
+       throw new RepositoryManagerException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public Metadata getOrigValues(Metadata metadata, ProductType productType)
-             throws XmlRpcException, IOException {
-         Vector<Object> args = new Vector<Object>();
-         args.add(metadata.getHashtable());
-         args.add(XmlRpcStructFactory.getXmlRpcProductType(productType));
+     if (productTypeVector == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory
+           .getProductTypeListFromXmlRpc(productTypeVector);
+     }
+   }
+ 
+   @SuppressWarnings("unchecked")
+   public List<Reference> getProductReferences(Product product)
+       throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
  
-         Metadata m = new Metadata();
-         m.addMetadata((Hashtable<String, Object>) this.client.execute(
-                 "filemgr.getOrigValues", args));
+     Vector<Map<String, Object>> productReferenceVector;
+     Map<String, Object> productHash = XmlRpcStructFactory
+         .getXmlRpcProduct(product);
+     argList.add(productHash);
  
-         return m;
+     try {
+       productReferenceVector = (Vector<Map<String, Object>>) client
+           .execute("filemgr.getProductReferences", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     @SuppressWarnings("unchecked")
-     public Query getCatalogQuery(Query query, ProductType productType)
-             throws XmlRpcException, IOException {
-         Vector<Object> args = new Vector<Object>();
-         args.add(XmlRpcStructFactory.getXmlRpcQuery(query));
-         args.add(XmlRpcStructFactory.getXmlRpcProductType(productType));
-         return XmlRpcStructFactory
-                 .getQueryFromXmlRpc((Hashtable<String, Object>) this.client
-                         .execute("filemgr.getCatalogQuery", args));
+     if (productReferenceVector == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory
+           .getReferencesFromXmlRpc(productReferenceVector);
      }
-     /**
-      * @return Returns the fileManagerUrl.
-      */
-     public URL getFileManagerUrl() {
-         return fileManagerUrl;
+   }
+ 
+   @SuppressWarnings("unchecked")
+   public Product getProductById(String productId) throws CatalogException {
+     Vector<Object> argList = new Vector<Object>();
+ 
+     Map<String, Object> productHash;
+     argList.add(productId);
+ 
+     try {
+       productHash = (Map<String, Object>) client.execute(
+           "filemgr.getProductById", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
+     }
+ 
+     if (productHash == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory.getProductFromXmlRpc(productHash);
      }
+   }
+ 
+   @SuppressWarnings("unchecked")
+   public Product getProductByName(String productName) throws CatalogException 
{
+     Vector<Object> argList = new Vector<Object>();
  
-     /**
-      * @param fileManagerUrl
-      *            The fileManagerUrl to set.
-      */
-     public void setFileManagerUrl(URL fileManagerUrl) {
-         this.fileManagerUrl = fileManagerUrl;
+     Map<String, Object> productHash;
+     argList.add(productName);
  
-         // reset the client
-         this.client = new XmlRpcClient(fileManagerUrl);
+     try {
+       productHash = (Map<String, Object>) client.execute(
+           "filemgr.getProductByName", argList);
+     } catch (XmlRpcException e) {
+       throw new CatalogException(e);
+     } catch (IOException e) {
+       throw new CatalogException(e);
      }
  
-     /**
-      * @return Returns the dataTransfer.
-      */
-     public DataTransfer getDataTransfer() {
-         return dataTransfer;
+     if (productHash == null) {
+       return null;
+     } else {
+       return XmlRpcStructFactory.getProductFromXmlRpc(productHash);
      }
+   }
  
-     /**
-      * @param dataTransfer
-      *            The dataTransfer to set.
-      */
-     public void setDataTransfer(DataTransfer dataTransfer) {
-         this.dataTransfer = dataTransfer;
-         this.dataTransfer.setFileManagerUrl(this.fileManagerUrl);
+   public String ingestProduct(Product product, Metadata metadata,
+                               boolean clientTransfer)
+       throws VersioningException, XmlRpcException, FileManagerException {
+     try {
+       // ingest product
+       Vector<Object> argList = new Vector<Object>();
+       Map<String, Object> productHash = XmlRpcStructFactory
+           .getXmlRpcProduct(product);
+       argList.add(productHash);
+       argList.add(metadata.getHashTable());
+       argList.add(clientTransfer);
+       String productId = (String) client.execute("filemgr.ingestProduct",
+           argList);
+ 
+       if (clientTransfer) {
+         LOG.log(Level.FINEST,
+             "File Manager Client: clientTransfer enabled: "
+             + "transfering product ["
+             + product.getProductName() + "]");
+ 
+         // we need to transfer the product ourselves
+         // make sure we have the product ID
+         if (productId == null) {
+           throw new Exception("Request to ingest product: "
+                               + product.getProductName()
+                               + " but no product ID returned from File "
+                               + "Manager ingest");
+         }
+ 
+         if (dataTransfer == null) {
+           throw new Exception("Request to ingest product: ["
+                               + product.getProductName()
+                               + "] using client transfer, but no "
+                               + "dataTransferer specified!");
+         }
+ 
+         product.setProductId(productId);
+ 
+         if 
(!Boolean.getBoolean("org.apache.oodt.cas.filemgr.serverside.versioning")) {
+           // version the product
+           Versioner versioner = GenericFileManagerObjectFactory
+               .getVersionerFromClassName(product.getProductType()
+                                                 .getVersioner());
+           if (versioner != null) {
+             versioner.createDataStoreReferences(product, metadata);
+           }
+ 
+           // add the newly versioned references to the data store
+           try {
+             addProductReferences(product);
+           } catch (CatalogException e) {
+             LOG
+                 .log(
+                     Level.SEVERE,
+                     "ingestProduct: RepositoryManagerException "
+                     + "when adding Product References for Product : "
+                     + product.getProductName()
+                     + " to RepositoryManager: Message: "
+                     + e);
+             throw e;
+           }
+         } else {
+           product.setProductReferences(getProductReferences(product));
+         }
+ 
+         // now transfer the product
+         try {
+           dataTransfer.transferProduct(product);
+           // now update the product's transfer status in the data
+           // store
+           product.setTransferStatus(Product.STATUS_RECEIVED);
+ 
+           try {
+             setProductTransferStatus(product);
+           } catch (CatalogException e) {
+             LOG
+                 .log(
+                     Level.SEVERE,
+                     "ingestProduct: RepositoryManagerException "
+                     + "when updating product transfer status for Product: "
+                     + product.getProductName()
+                     + " Message: " + e);
+             throw e;
+           }
+         } catch (Exception e) {
+           LOG.log(Level.SEVERE,
+               "ingestProduct: DataTransferException when transfering Product: 
"
+               + product.getProductName() + ": Message: "
+               + e);
+           throw new DataTransferException(e);
+         }
+ 
+       }
+       return productId;
+ 
+       // error versioning file
+     } catch (VersioningException e) {
+       LOG.log(Level.SEVERE, e.getMessage());
+       LOG.log(Level.SEVERE,
+           "ingestProduct: VersioningException when versioning Product: "
+           + product.getProductName() + " with Versioner "
+           + product.getProductType().getVersioner()
+           + ": Message: " + e);
+       throw new VersioningException(e);
+     } catch (XmlRpcException e2) {
+       LOG.log(Level.SEVERE, "Failed to ingest product [ name:" + 
product.getProductName() + "] :" + e2.getMessage()
+                             + " -- rolling back ingest");
+       try {
+         Vector<Object> argList = new Vector<Object>();
+         Map<String, Object> productHash = XmlRpcStructFactory
+             .getXmlRpcProduct(product);
+         argList.add(productHash);
+         client.execute("filemgr.removeProduct", argList);
+       } catch (Exception e1) {
+         LOG.log(Level.SEVERE, "Failed to rollback ingest of product ["
+                               + product + "] : " + e2.getMessage());
+       }
+       throw e2;
+     } catch (Exception e) {
+       LOG.log(Level.SEVERE, "Failed to ingest product [ id: " + 
product.getProductId() +
+                             "/ name:" + product.getProductName() + "] :" + e 
+ " -- rolling back ingest");
+       try {
+         Vector<Object> argList = new Vector<Object>();
+         Map<String, Object> productHash = XmlRpcStructFactory
+             .getXmlRpcProduct(product);
+         argList.add(productHash);
+         client.execute("filemgr.removeProduct", argList);
+       } catch (Exception e1) {
+         LOG.log(Level.SEVERE, "Failed to rollback ingest of product ["
+                               + product + "] : " + e);
+       }
+       throw new FileManagerException("Failed to ingest product [" + product + 
"] : "
+                                      + e);
      }
  
+   }
+ 
+   @SuppressWarnings("unchecked")
+   public Metadata getCatalogValues(Metadata metadata, ProductType productType)
+       throws XmlRpcException, IOException {
+     Vector<Object> args = new Vector<Object>();
+     args.add(metadata.getHashTable());
+     args.add(XmlRpcStructFactory.getXmlRpcProductType(productType));
+ 
+     Metadata m = new Metadata();
+     m.addMetadata((Map<String, Object>) this.client.execute(
+         "filemgr.getCatalogValues", args));
+ 
+     return m;
+   }
+ 
+   @SuppressWarnings("unchecked")
+   public Metadata getOrigValues(Metadata metadata, ProductType productType)
+       throws XmlRpcException, IOException {
+     Vector<Object> args = new Vector<Object>();
+     args.add(metadata.getHashTable());
+     args.add(XmlRpcStructFactory.getXmlRpcProductType(productType));
+ 
+     Metadata m = new Metadata();
+     m.addMetadata((Map<String, Object>) this.client.execute(
+         "filemgr.getOrigValues", args));
+ 
+     return m;
+   }
+ 
+   @SuppressWarnings("unchecked")
+   public Query getCatalogQuery(Query query, ProductType productType)
+       throws XmlRpcException, IOException {
+     Vector<Object> args = new Vector<Object>();
+     args.add(XmlRpcStructFactory.getXmlRpcQuery(query));
+     args.add(XmlRpcStructFactory.getXmlRpcProductType(productType));
+     return XmlRpcStructFactory
+         .getQueryFromXmlRpc((Hashtable<String, Object>) this.client
+             .execute("filemgr.getCatalogQuery", args));
+   }
+ 
+   public static void main(String[] args) {
+     CmdLineUtility cmdLineUtility = new CmdLineUtility();
+     cmdLineUtility.run(args);
+   }
+ 
+   /**
+    * @return Returns t

<TRUNCATED>

Reply via email to