You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oodt.apache.org by ma...@apache.org on 2015/11/04 13:19:04 UTC

[1/6] oodt git commit: refactor for xmlrpc arghhh

Repository: oodt
Updated Branches:
  refs/heads/master 9d13beabc -> 8705ccf40


refactor for xmlrpc arghhh


Project: http://git-wip-us.apache.org/repos/asf/oodt/repo
Commit: http://git-wip-us.apache.org/repos/asf/oodt/commit/aa5e31a6
Tree: http://git-wip-us.apache.org/repos/asf/oodt/tree/aa5e31a6
Diff: http://git-wip-us.apache.org/repos/asf/oodt/diff/aa5e31a6

Branch: refs/heads/master
Commit: aa5e31a618a9aa17de920b975c9443e7583ecd14
Parents: 9d13bea
Author: Tom Barber <to...@analytical-labs.com>
Authored: Wed Nov 4 09:40:57 2015 +0000
Committer: Tom Barber <to...@analytical-labs.com>
Committed: Wed Nov 4 09:40:57 2015 +0000

----------------------------------------------------------------------
 .../oodt/cas/filemgr/catalog/LuceneCatalog.java | 112 ++---
 .../cas/filemgr/system/XmlRpcFileManager.java   | 447 ++++++++++++++++++-
 .../filemgr/system/XmlRpcFileManagerClient.java |  75 ++--
 .../cas/filemgr/util/XmlRpcStructFactory.java   | 361 ++++++++++++---
 .../org/apache/oodt/cas/metadata/Metadata.java  |  15 +-
 .../resource/system/XmlRpcResourceManager.java  |   7 +-
 6 files changed, 821 insertions(+), 196 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/oodt/blob/aa5e31a6/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/LuceneCatalog.java
----------------------------------------------------------------------
diff --git a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/LuceneCatalog.java b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/LuceneCatalog.java
index e5985ad..d3c297a 100644
--- a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/LuceneCatalog.java
+++ b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/catalog/LuceneCatalog.java
@@ -154,27 +154,27 @@ public class LuceneCatalog implements Catalog {
      */
     public synchronized void addMetadata(Metadata m, Product product)
             throws CatalogException {
-        CompleteProduct p = CATALOG_CACHE.get(product.getProductId());
-
-        if (p == null) {
-        	// move product from index to cache
-        	// it will be moved back after metadata is added
-        	p = getCompleteProductById(product.getProductId(), true, true);
-        	LOG.log(Level.FINE, "Product not found in local cache, retrieved from index");
-        	removeProduct(product);        		
-        }
-        
-        if (p != null) {
-            p.setMetadata(m);
-            if (hasMetadataAndRefs(p)) {
-                LOG.log(Level.FINE,
+        if(product.getProductId()!=null && CATALOG_CACHE.containsKey(product.getProductId())) {
+            CompleteProduct p = CATALOG_CACHE.get(product.getProductId());
+
+                p.setMetadata(m);
+                if (hasMetadataAndRefs(p)) {
+                    LOG.log(Level.FINE,
                         "metadata and references present for product: ["
-                                + product.getProductId() + "]");
-                addCompleteProductToIndex(p);
-                // now remove its entry from the cache
-                CATALOG_CACHE.remove(product.getProductId());
+                        + product.getProductId() + "]");
+                    addCompleteProductToIndex(p);
+                    // now remove its entry from the cache
+                    CATALOG_CACHE.remove(product.getProductId());
             }
         }
+        else{
+                // move product from index to cache
+                // it will be moved back after metadata is added
+                CompleteProduct p = getCompleteProductById(product.getProductId(), true, true);
+                LOG.log(Level.FINE, "Product not found in local cache, retrieved from index");
+                removeProduct(product);
+
+        }
     }
 
     /*
@@ -185,15 +185,20 @@ public class LuceneCatalog implements Catalog {
      */
     public synchronized void removeMetadata(Metadata m, Product product)
             throws CatalogException {
-        CompleteProduct p = CATALOG_CACHE.get(product.getProductId());
-        
-        if (p == null) {
-            // not in local cache, get doc and rewrite index
+        CompleteProduct p=null;
+
+        if(product.getProductId()!=null && CATALOG_CACHE.containsKey(product.getProductId())) {
+             p = CATALOG_CACHE.get(product.getProductId());
+        }
+        else{
             String prodId = product.getProductId();
             p = getCompleteProductById(prodId, true, true);
             removeProductDocument(product);
         }
 
+
+
+
         Metadata currMet = p.getMetadata();
         List<String> metadataTypes = new ArrayList<String>();
 
@@ -238,29 +243,31 @@ public class LuceneCatalog implements Catalog {
      */
     public synchronized void addProduct(Product product)
             throws CatalogException {
-        CompleteProduct p = CATALOG_CACHE.get(product
-                .getProductId());
+        if(product.getProductId()!=null && CATALOG_CACHE.containsKey(product.getProductId())) {
+            throw new CatalogException(
+                "Attempt to add a product that already existed: product: ["
+                + product.getProductName() + "]");
+
+
 
-        if (p == null) {
+
+
+        } else {
             // haven't cached this product yet, so let's cache it
             CompleteProduct completeProduct = new CompleteProduct();
 
             // NOTE: reuse existing ID if possible
             if (product.getProductId() == null) {
-	            synchronized (completeProduct) {
-	                // now generate a unique ID for the product
-	                UUID prodUUID = generator.generateTimeBasedUUID();
-	                product.setProductId(prodUUID.toString());
-	            }
+                synchronized (completeProduct) {
+                    // now generate a unique ID for the product
+                    UUID prodUUID = generator.generateTimeBasedUUID();
+                    product.setProductId(prodUUID.toString());
+                }
             }
 
             completeProduct.setProduct(product);
             CATALOG_CACHE.put(product.getProductId(), completeProduct);
 
-        } else {
-            throw new CatalogException(
-                    "Attempt to add a product that already existed: product: ["
-                            + product.getProductName() + "]");
         }
 
     }
@@ -272,7 +279,7 @@ public class LuceneCatalog implements Catalog {
      */
     public synchronized void modifyProduct(Product product)
             throws CatalogException {
-        if (CATALOG_CACHE.get(product.getProductId()) != null) {
+        if (product.getProductId()!=null && CATALOG_CACHE.containsKey(product.getProductId())) {
             LOG.log(Level.FINE, "Modifying product: [" + product.getProductId()
                     + "]: found product in cache!");
             CompleteProduct cp = CATALOG_CACHE.get(product
@@ -326,29 +333,28 @@ public class LuceneCatalog implements Catalog {
      */
     public synchronized void addProductReferences(Product product)
             throws CatalogException {
-        CompleteProduct p = CATALOG_CACHE.get(product
+        if(product.getProductId()!=null && CATALOG_CACHE.containsKey(product.getProductId())) {
+            CompleteProduct p = CATALOG_CACHE.get(product
                 .getProductId());
-
-        if (p == null) {
-        	// move product from index to cache
-        	// it will be moved back after metadata is added
-        	p = getCompleteProductById(product.getProductId(), true, true);
-        	LOG.log(Level.FINE, "Product not found in local cache, retrieved from index");
-        	removeProduct(product);        		
-        }
-        
-        if (p != null) {
             p.getProduct().setProductReferences(product.getProductReferences());
-            if (hasMetadataAndRefs(p)) {
-                LOG.log(Level.FINE,
+                if (hasMetadataAndRefs(p)) {
+                    LOG.log(Level.FINE,
                         "metadata and references present for product: ["
-                                + product.getProductId() + "]");
-                addCompleteProductToIndex(p);
-                // now remove its entry from the cache
-                CATALOG_CACHE.remove(product.getProductId());
-            }
+                        + product.getProductId() + "]");
+                    addCompleteProductToIndex(p);
+                    // now remove its entry from the cache
+                    CATALOG_CACHE.remove(product.getProductId());
+                }
+
         }
+        else{
+                // move product from index to cache
+                // it will be moved back after metadata is added
+                CompleteProduct p = getCompleteProductById(product.getProductId(), true, true);
+                LOG.log(Level.FINE, "Product not found in local cache, retrieved from index");
+                removeProduct(product);
 
+        }
     }
 
     /*

http://git-wip-us.apache.org/repos/asf/oodt/blob/aa5e31a6/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
----------------------------------------------------------------------
diff --git a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
index 65b84a6..4be4dc1 100644
--- a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
+++ b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
@@ -65,12 +65,12 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.Arrays;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.Map;
+import java.util.Hashtable;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -228,7 +228,7 @@ public class XmlRpcFileManager {
             int pageNum) throws CatalogException {
         ProductType type = XmlRpcStructFactory
                 .getProductTypeFromXmlRpc(productTypeHash);
-        Query query = XmlRpcStructFactory.getQueryFromXmlRpc(queryHash);
+        Query query = XmlRpcStructFactory.getQueryFromXmlRpcMap(queryHash);
 
         ProductPage prodPage;
 
@@ -271,6 +271,21 @@ public class XmlRpcFileManager {
         return XmlRpcStructFactory.getXmlRpcProductPage(page);
     }
 
+  public Hashtable<String, Object> getFirstPage(
+      Hashtable<String, Object> productTypeHash) {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    ProductPage page = catalog.getFirstPage(type);
+    try {
+      setProductType(page.getPageProducts());
+    } catch (Exception e) {
+      LOG.log(Level.WARNING,
+          "Unable to set product types for product page list: ["
+          + page + "]");
+    }
+    return XmlRpcStructFactory.getXmlRpcProductPage(page);
+  }
+
     public Map<String, Object> getLastPage(
             Map<String, Object> productTypeHash) {
         ProductType type = XmlRpcStructFactory
@@ -339,7 +354,15 @@ public class XmlRpcFileManager {
         return true;
     }
 
-    public int getNumProducts(Map<String, Object> productTypeHash)
+  public synchronized boolean setProductTransferStatus(
+      Hashtable<String, Object> productHash)
+      throws CatalogException {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    catalog.setProductTransferStatus(product);
+    return true;
+  }
+
+  public int getNumProducts(Map<String, Object> productTypeHash)
             throws CatalogException {
         int numProducts;
 
@@ -359,13 +382,33 @@ public class XmlRpcFileManager {
         return numProducts;
     }
 
-    public List<Map<String, Object>> getTopNProducts(int n)
+  public int getNumProducts(Hashtable<String, Object> productTypeHash)
+      throws CatalogException {
+    int numProducts;
+
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+
+    try {
+      numProducts = catalog.getNumProducts(type);
+    } catch (CatalogException e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.WARNING,
+          "Exception when getting num products: Message: "
+          + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
+    }
+
+    return numProducts;
+  }
+
+  public List<Map<String, Object>> getTopNProductsMap(int n)
             throws CatalogException {
         List<Product> topNProducts;
 
         try {
             topNProducts = catalog.getTopNProducts(n);
-            return XmlRpcStructFactory.getXmlRpcProductList(topNProducts);
+            return XmlRpcStructFactory.getXmlRpcProductListMap(topNProducts);
         } catch (Exception e) {
             LOG.log(Level.SEVERE, e.getMessage());
             LOG.log(Level.WARNING,
@@ -375,6 +418,42 @@ public class XmlRpcFileManager {
         }
     }
 
+  public List<Hashtable<String, Object>> getTopNProducts(int n)
+      throws CatalogException {
+    List<Product> topNProducts;
+
+    try {
+      topNProducts = catalog.getTopNProducts(n);
+      return XmlRpcStructFactory.getXmlRpcProductList(topNProducts);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.WARNING,
+          "Exception when getting topN products: Message: "
+          + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
+    }
+  }
+
+  public List<Hashtable<String, Object>> getTopNProducts(int n,
+                                                   Hashtable<String, Object> productTypeHash)
+      throws CatalogException {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    List<Product> topNProducts;
+
+    try {
+      topNProducts = catalog.getTopNProducts(n, type);
+      return XmlRpcStructFactory.getXmlRpcProductList(topNProducts);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.WARNING,
+          "Exception when getting topN products by product type: ["
+          + type.getProductTypeId() + "]: Message: "
+          + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
+    }
+
+  }
     public List<Map<String, Object>> getTopNProducts(int n,
             Map<String, Object> productTypeHash)
             throws CatalogException {
@@ -384,7 +463,7 @@ public class XmlRpcFileManager {
 
         try {
             topNProducts = catalog.getTopNProducts(n, type);
-            return XmlRpcStructFactory.getXmlRpcProductList(topNProducts);
+            return XmlRpcStructFactory.getXmlRpcProductListMap(topNProducts);
         } catch (Exception e) {
             LOG.log(Level.SEVERE, e.getMessage());
             LOG.log(Level.WARNING,
@@ -408,6 +487,12 @@ public class XmlRpcFileManager {
         return this.getMetadata(product).getMap();
     }
 
+  public Hashtable<String, Object> getMetadata(
+      Hashtable<String, Object> productHash) throws CatalogException {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return this.getMetadata(product).getHashTable();
+  }
+
     public Map<String, Object> getReducedMetadata(
             Map<String, Object> productHash, Vector<String> elements)
             throws CatalogException {
@@ -415,6 +500,12 @@ public class XmlRpcFileManager {
         return this.getReducedMetadata(product, elements).getMap();
     }
 
+  public Hashtable<String, Object> getReducedMetadata(
+      Hashtable<String, Object> productHash, Vector<String> elements)
+      throws CatalogException {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return this.getReducedMetadata(product, elements).getHashTable();
+  }
     public List<Map<String, Object>> getProductTypes()
             throws RepositoryManagerException {
         List<ProductType> productTypeList;
@@ -440,7 +531,7 @@ public class XmlRpcFileManager {
 
         try {
             referenceList = catalog.getProductReferences(product);
-            return XmlRpcStructFactory.getXmlRpcReferences(referenceList);
+            return XmlRpcStructFactory.getXmlRpcReferencesMap(referenceList);
         } catch (CatalogException e) {
             LOG.log(Level.SEVERE, e.getMessage());
             LOG.log(Level.SEVERE, "Unable to obtain references for product: ["
@@ -451,6 +542,24 @@ public class XmlRpcFileManager {
 
     }
 
+  public List<Hashtable<String, Object>> getProductReferences(
+      Hashtable<String, Object> productHash)
+      throws CatalogException {
+    List<Reference> referenceList;
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+
+    try {
+      referenceList = catalog.getProductReferences(product);
+      return XmlRpcStructFactory.getXmlRpcReferences(referenceList);
+    } catch (CatalogException e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE, "Unable to obtain references for product: ["
+                            + product.getProductName() + "]: Message: "
+                            + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
+    }
+
+  }
     public Map<String, Object> getProductById(String productId)
             throws CatalogException {
         Product product = null;
@@ -517,7 +626,7 @@ public class XmlRpcFileManager {
 
         try {
             productList = catalog.getProductsByProductType(type);
-            return XmlRpcStructFactory.getXmlRpcProductList(productList);
+            return XmlRpcStructFactory.getXmlRpcProductListMap(productList);
         } catch (Exception e) {
             LOG.log(Level.SEVERE, e.getMessage());
             LOG.log(Level.SEVERE,
@@ -527,6 +636,24 @@ public class XmlRpcFileManager {
         }
     }
 
+  public List<Hashtable<String, Object>> getProductsByProductType(
+      Hashtable<String, Object> productTypeHash)
+      throws CatalogException {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    List<Product> productList;
+
+    try {
+      productList = catalog.getProductsByProductType(type);
+      return XmlRpcStructFactory.getXmlRpcProductList(productList);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE,
+          "Exception obtaining products by product type for type: ["
+          + type.getName() + "]: Message: " + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
+    }
+  }
     public List<Map<String, Object>> getElementsByProductType(
             Map<String, Object> productTypeHash)
             throws ValidationLayerException {
@@ -536,6 +663,7 @@ public class XmlRpcFileManager {
 
         try {
             elementList = catalog.getValidationLayer().getElements(type);
+          Map hm = new ConcurrentHashMap();
             return XmlRpcStructFactory.getXmlRpcElementList(elementList);
         } catch (Exception e) {
             LOG.log(Level.SEVERE, e.getMessage());
@@ -578,11 +706,11 @@ public class XmlRpcFileManager {
         }
     }
 
-    public List<Map<String, Object>> complexQuery(
+    public List<Map<String, Object>> complexQueryMap(
             Map<String, Object> complexQueryHash) throws CatalogException {
         try {
             ComplexQuery complexQuery = XmlRpcStructFactory
-                    .getComplexQueryFromXmlRpc(complexQueryHash);
+                    .getComplexQueryFromXmlRpcMap(complexQueryHash);
 
             // get ProductTypes
             List<ProductType> productTypes;
@@ -631,31 +759,108 @@ public class XmlRpcFileManager {
                   .getSortByMetKey());
             }
 
-            return XmlRpcStructFactory.getXmlRpcQueryResults(queryResults);
+            return XmlRpcStructFactory.getXmlRpcQueryResultsMap(queryResults);
         } catch (Exception e) {
             LOG.log(Level.SEVERE, e.getMessage());
             throw new CatalogException("Failed to perform complex query : "
                     + e.getMessage(), e);
         }
     }
-    
+
+  public List<Hashtable<String, Object>> complexQuery(
+      Hashtable<String, Object> complexQueryHash) throws CatalogException {
+    try {
+      ComplexQuery complexQuery = XmlRpcStructFactory
+          .getComplexQueryFromXmlRpc(complexQueryHash);
+
+      // get ProductTypes
+      List<ProductType> productTypes;
+      if (complexQuery.getReducedProductTypeNames() == null) {
+        productTypes = this.repositoryManager.getProductTypes();
+      } else {
+        productTypes = new Vector<ProductType>();
+        for (String productTypeName : complexQuery
+            .getReducedProductTypeNames()) {
+          productTypes.add(this.repositoryManager
+              .getProductTypeByName(productTypeName));
+        }
+      }
+
+      // get Metadata
+      List<QueryResult> queryResults = new LinkedList<QueryResult>();
+      for (ProductType productType : productTypes) {
+        List<String> productIds = catalog.query(this.getCatalogQuery(
+            complexQuery, productType), productType);
+        for (String productId : productIds) {
+          Product product = catalog.getProductById(productId);
+          product.setProductType(productType);
+          QueryResult qr = new QueryResult(product, this
+              .getReducedMetadata(product, complexQuery
+                  .getReducedMetadata()));
+          qr.setToStringFormat(complexQuery
+              .getToStringResultFormat());
+          queryResults.add(qr);
+        }
+      }
+
+      LOG.log(Level.INFO, "Query returned " + queryResults.size()
+                          + " results");
+
+      // filter query results
+      if (complexQuery.getQueryFilter() != null) {
+        queryResults = applyFilterToResults(queryResults, complexQuery
+            .getQueryFilter());
+        LOG.log(Level.INFO, "Filter returned " + queryResults.size()
+                            + " results");
+      }
+
+      // sort query results
+      if (complexQuery.getSortByMetKey() != null) {
+        queryResults = sortQueryResultList(queryResults, complexQuery
+            .getSortByMetKey());
+      }
+
+      return XmlRpcStructFactory.getXmlRpcQueryResults(queryResults);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      throw new CatalogException("Failed to perform complex query : "
+                                 + e.getMessage(), e);
+    }
+  }
     public List<Map<String, Object>> query(
             Map<String, Object> queryHash,
             Map<String, Object> productTypeHash)
             throws CatalogException {
-        Query query = XmlRpcStructFactory.getQueryFromXmlRpc(queryHash);
+        Query query = XmlRpcStructFactory.getQueryFromXmlRpcMap(queryHash);
         ProductType type = XmlRpcStructFactory
                 .getProductTypeFromXmlRpc(productTypeHash);
-        return XmlRpcStructFactory.getXmlRpcProductList(this.query(query, type));
+        return XmlRpcStructFactory.getXmlRpcProductListMap(this.query(query, type));
     }
 
-    public Map<String, Object> getProductTypeByName(String productTypeName)
+  public List<Hashtable<String, Object>> query(
+      Hashtable<String, Object> queryHash,
+      Hashtable<String, Object> productTypeHash)
+      throws CatalogException {
+    Query query = XmlRpcStructFactory.getQueryFromXmlRpc(queryHash);
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    return XmlRpcStructFactory.getXmlRpcProductList(this.query(query, type));
+  }
+
+    public Map<String, Object> getProductTypeByNameMap(String productTypeName)
             throws RepositoryManagerException {
         ProductType type = repositoryManager
                 .getProductTypeByName(productTypeName);
         return XmlRpcStructFactory.getXmlRpcProductType(type);
     }
 
+  public Hashtable<String, Object> getProductTypeByName(String productTypeName)
+      throws RepositoryManagerException {
+    ProductType type = repositoryManager
+        .getProductTypeByName(productTypeName);
+    return XmlRpcStructFactory.getXmlRpcProductType(type);
+  }
+
     public Map<String, Object> getProductTypeById(String productTypeId)
             throws RepositoryManagerException {
         ProductType type;
@@ -683,12 +888,27 @@ public class XmlRpcFileManager {
         return true;
     }
 
+  public synchronized boolean updateMetadata(Hashtable<String, Object> productHash,
+                                             Hashtable<String, Object> metadataHash) throws CatalogException{
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    Metadata met = new Metadata();
+    met.addMetadata(metadataHash);
+    Metadata oldMetadata = catalog.getMetadata(product);
+    catalog.removeMetadata(oldMetadata, product);
+    catalog.addMetadata(met, product);
+    return true;
+  }
     public synchronized String catalogProduct(Map<String, Object> productHash)
             throws CatalogException {
         Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
         return catalogProduct(p);
     }
 
+  public synchronized String catalogProduct(Hashtable<String, Object> productHash)
+      throws CatalogException {
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return catalogProduct(p);
+  }
     public synchronized boolean addMetadata(Map<String, Object> productHash,
             Map<String, String> metadata) throws CatalogException {
         Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
@@ -697,13 +917,27 @@ public class XmlRpcFileManager {
         return addMetadata(p, m) != null;
     }
 
+  public synchronized boolean addMetadata(Hashtable<String, Object> productHash,
+                                          Hashtable<String, String> metadata) throws CatalogException {
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    Metadata m = new Metadata();
+    m.addMetadata((Map)metadata);
+    return addMetadata(p, m) != null;
+  }
     public synchronized boolean addProductReferences(Map<String, Object> productHash)
             throws CatalogException {
         Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
         return addProductReferences(product);
     }
 
-    public String ingestProduct(Map<String, Object> productHash,
+  public synchronized boolean addProductReferences(Hashtable<String, Object> productHash)
+      throws CatalogException {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return addProductReferences(product);
+  }
+
+
+  public String ingestProduct(Map<String, Object> productHash,
       Map<String, String> metadata, boolean clientTransfer)
       throws
         CatalogException {
@@ -779,6 +1013,81 @@ public class XmlRpcFileManager {
 
   }
 
+  public String ingestProduct(Hashtable<String, Object> productHash,
+                              Hashtable<String, String> metadata, boolean clientTransfer)
+      throws
+      CatalogException {
+
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+
+    try {
+      // first, create the product
+      p.setTransferStatus(Product.STATUS_TRANSFER);
+      catalogProduct(p);
+
+      // now add the metadata
+      Metadata m = new Metadata();
+      m.addMetadata((Map)metadata);
+      Metadata expandedMetdata = addMetadata(p, m);
+
+      // version the product
+      if (!clientTransfer || (Boolean.getBoolean("org.apache.oodt.cas.filemgr.serverside.versioning"))) {
+        Versioner versioner;
+        try {
+          versioner = GenericFileManagerObjectFactory
+              .getVersionerFromClassName(p.getProductType().getVersioner());
+          if (versioner != null) {
+            versioner.createDataStoreReferences(p, expandedMetdata);
+          }
+        } catch (Exception e) {
+          LOG.log(Level.SEVERE,
+              "ingestProduct: VersioningException when versioning Product: "
+              + p.getProductName() + " with Versioner "
+              + p.getProductType().getVersioner() + ": Message: "
+              + e.getMessage());
+          throw new VersioningException(e);
+        }
+
+        // add the newly versioned references to the data store
+        addProductReferences(p);
+      }
+
+      if (!clientTransfer) {
+        LOG.log(Level.FINEST,
+            "File Manager: ingest: no client transfer enabled, "
+            + "server transfering product: [" + p.getProductName() + "]");
+
+        // now transfer the product
+        try {
+          dataTransfer.transferProduct(p);
+          // now update the product's transfer status in the data store
+          p.setTransferStatus(Product.STATUS_RECEIVED);
+
+          try {
+            catalog.setProductTransferStatus(p);
+          } catch (CatalogException e) {
+            LOG.log(Level.SEVERE, "ingestProduct: CatalogException "
+                                  + "when updating product transfer status for Product: "
+                                  + p.getProductName() + " Message: " + e.getMessage());
+            throw e;
+          }
+        } catch (Exception e) {
+          LOG.log(Level.SEVERE,
+              "ingestProduct: DataTransferException when transfering Product: "
+              + p.getProductName() + ": Message: " + e.getMessage());
+          throw new DataTransferException(e);
+        }
+      }
+
+      // that's it!
+      return p.getProductId();
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      throw new CatalogException("Error ingesting product [" + p + "] : "
+                                 + e.getMessage(),e);
+    }
+
+  }
    public byte[] retrieveFile(String filePath, int offset, int numBytes)
          throws DataTransferException {
       FileInputStream is = null;
@@ -933,6 +1242,73 @@ public class XmlRpcFileManager {
         }
     }
 
+  public boolean moveProduct(Hashtable<String, Object> productHash, String newPath)
+      throws DataTransferException {
+
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+
+    // first thing we care about is if the product is flat or heirarchical
+    if (p.getProductStructure().equals(Product.STRUCTURE_FLAT)) {
+      // we just need to get its first reference
+      if (p.getProductReferences() == null || (p.getProductReferences().size() != 1)) {
+        throw new DataTransferException(
+            "Flat products must have a single reference: cannot move");
+      }
+
+      // okay, it's fine to move it
+      // first, we need to update the data store ref
+      Reference r = p.getProductReferences().get(0);
+      if (r.getDataStoreReference().equals(
+          new File(newPath).toURI().toString())) {
+        throw new DataTransferException("cannot move product: ["
+                                        + p.getProductName() + "] to same location: ["
+                                        + r.getDataStoreReference() + "]");
+      }
+
+      // create a copy of the current data store path: we'll need it to
+      // do the data transfer
+      Reference copyRef = new Reference(r);
+
+      // update the copyRef to have the data store ref as the orig ref
+      // the the newLoc as the new ref
+      copyRef.setOrigReference(r.getDataStoreReference());
+      copyRef.setDataStoreReference(new File(newPath).toURI().toString());
+
+      p.getProductReferences().clear();
+      p.getProductReferences().add(copyRef);
+
+      // now transfer it
+      try {
+        this.dataTransfer.transferProduct(p);
+      } catch (IOException e) {
+        throw new DataTransferException(e);
+      }
+
+      // now delete the original copy
+      try {
+        if (!new File(new URI(copyRef.getOrigReference())).delete()) {
+          LOG.log(Level.WARNING, "Deletion of original file: ["
+                                 + r.getDataStoreReference()
+                                 + "] on product move returned false");
+        }
+      } catch (URISyntaxException e) {
+        throw new DataTransferException(
+            "URI Syntax exception trying to remove original product ref: Message: "
+            + e.getMessage(), e);
+      }
+
+      // now save the updated reference
+      try {
+        this.catalog.modifyProduct(p);
+        return true;
+      } catch (CatalogException e) {
+        throw new DataTransferException(e.getMessage(),e);
+      }
+    } else {
+      throw new UnsupportedOperationException(
+          "Moving of heirarhical and stream products not supported yet");
+    }
+  }
     public boolean removeFile(String filePath) throws DataTransferException, IOException {
       // TODO(bfoster): Clean this up so that it deletes by product not file.
       Product product = new Product();
@@ -980,8 +1356,18 @@ public class XmlRpcFileManager {
         ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
         return this.getCatalogValues(m, productType).getMap();
     }
-    
-    public Map<String, Object> getOrigValues(
+
+  public Hashtable<String, Object> getCatalogValues(
+      Hashtable<String, Object> metadataHash,
+      Hashtable<String, Object> productTypeHash)
+      throws RepositoryManagerException {
+    Metadata m = new Metadata();
+    m.addMetadata(metadataHash);
+    ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
+    return this.getCatalogValues(m, productType).getHashTable();
+  }
+
+  public Map<String, Object> getOrigValues(
         Map<String, Object> metadataHash,
         Map<String, Object> productTypeHash)
             throws RepositoryManagerException {
@@ -990,17 +1376,36 @@ public class XmlRpcFileManager {
         ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
         return this.getOrigValues(m, productType).getMap();
     }
+
+  public Hashtable<String, Object> getOrigValues(
+      Hashtable<String, Object> metadataHash,
+      Hashtable<String, Object> productTypeHash)
+      throws RepositoryManagerException {
+    Metadata m = new Metadata();
+    m.addMetadata(metadataHash);
+    ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
+    return this.getOrigValues(m, productType).getHashTable();
+  }
     
     public Map<String, Object> getCatalogQuery(
             Map<String, Object> queryHash,
             Map<String, Object> productTypeHash)
             throws RepositoryManagerException, QueryFormulationException {
-        Query query = XmlRpcStructFactory.getQueryFromXmlRpc(queryHash);
+        Query query = XmlRpcStructFactory.getQueryFromXmlRpcMap(queryHash);
         ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
         return XmlRpcStructFactory.getXmlRpcQuery(this.getCatalogQuery(query, productType));
     }
 
-    public static void main(String[] args) throws IOException {
+  public Hashtable<String, Object> getCatalogQuery(
+      Hashtable<String, Object> queryHash,
+      Hashtable<String, Object> productTypeHash)
+      throws RepositoryManagerException, QueryFormulationException {
+    Query query = XmlRpcStructFactory.getQueryFromXmlRpc(queryHash);
+    ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
+    return XmlRpcStructFactory.getXmlRpcQuery(this.getCatalogQuery(query, productType));
+  }
+
+  public static void main(String[] args) throws IOException {
         int portNum = -1;
         String usage = "FileManager --portNum <port number for xml rpc service>\n";
 

http://git-wip-us.apache.org/repos/asf/oodt/blob/aa5e31a6/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManagerClient.java
----------------------------------------------------------------------
diff --git 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
index 268f32d..5c471d9 100644
--- 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
@@ -54,6 +54,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.URL;
+import java.util.Hashtable;
 import java.util.Map;
 import java.util.List;
 import java.util.Vector;
@@ -222,7 +223,7 @@ public class XmlRpcFileManagerClient {
     public boolean transferringProduct(Product product)
             throws DataTransferException {
         Vector<Object> argList = new Vector<Object>();
-        Map<String, Object> productHash = XmlRpcStructFactory
+        Hashtable<String, Object> productHash = XmlRpcStructFactory
                 .getXmlRpcProduct(product);
         argList.add(productHash);
 
@@ -635,10 +636,10 @@ public class XmlRpcFileManagerClient {
         Vector<Object> argList = new Vector<Object>();
         argList.add(n);
 
-        Vector<Map<String, Object>> topNProducts;
+        Vector<Hashtable<String, Object>> topNProducts;
 
         try {
-            topNProducts = (Vector<Map<String, Object>>) client.execute(
+            topNProducts = (Vector<Hashtable<String, Object>>) client.execute(
                     "filemgr.getTopNProducts", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -659,10 +660,10 @@ public class XmlRpcFileManagerClient {
                 .getXmlRpcProductType(type);
         argList.add(productTypeHash);
 
-        Vector<Map<String, Object>> topNProducts;
+        Vector<Hashtable<String, Object>> topNProducts;
 
         try {
-            topNProducts = (Vector<Map<String, Object>>) client.execute(
+            topNProducts = (Vector<Hashtable<String, Object>>) client.execute(
                     "filemgr.getTopNProducts", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -711,7 +712,7 @@ public class XmlRpcFileManagerClient {
 
     Vector<Object> argList = new Vector<Object>();
     argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
-    argList.add(metadata.getMap());
+    argList.add(metadata.getHashTable());
 
     try {
       client.execute("filemgr.addMetadata", argList);
@@ -726,7 +727,7 @@ public class XmlRpcFileManagerClient {
       throws CatalogException {
     Vector<Object> argList = new Vector<Object>();
     argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
-    argList.add(met.getMap());
+    argList.add(met.getHashTable());
 
     boolean result;
 
@@ -868,10 +869,10 @@ public class XmlRpcFileManagerClient {
                 .getXmlRpcProductType(type);
         argList.add(productTypeHash);
 
-        Vector<Map<String, Object>> productVector;
+        Vector<Hashtable<String, Object>> productVector;
 
         try {
-            productVector = (Vector<Map<String, Object>>) client.execute(
+            productVector = (Vector<Hashtable<String, Object>>) client.execute(
                     "filemgr.getProductsByProductType", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -895,10 +896,10 @@ public class XmlRpcFileManagerClient {
 
         argList.add(productTypeHash);
 
-        Vector<Map<String, Object>> elementVector;
+        Vector<Hashtable<String, Object>> elementVector;
 
         try {
-            elementVector = (Vector<Map<String, Object>>) client.execute(
+            elementVector = (Vector<Hashtable<String, Object>>) client.execute(
                     "filemgr.getElementsByProductType", argList);
         } catch (XmlRpcException e) {
             throw new ValidationLayerException(e);
@@ -919,10 +920,10 @@ public class XmlRpcFileManagerClient {
         Vector<Object> argList = new Vector<Object>();
         argList.add(elementId);
 
-        Map<String, Object> elementHash;
+        Hashtable<String, Object> elementHash;
 
         try {
-            elementHash = (Map<String, Object>) client.execute(
+            elementHash = (Hashtable<String, Object>) client.execute(
                     "filemgr.getElementById", argList);
         } catch (XmlRpcException e) {
             throw new ValidationLayerException(e);
@@ -943,10 +944,10 @@ public class XmlRpcFileManagerClient {
         Vector<Object> argList = new Vector<Object>();
         argList.add(elementName);
 
-        Map<String, Object> elementHash;
+        Hashtable<String, Object> elementHash;
 
         try {
-            elementHash = (Map<String, Object>) client.execute(
+            elementHash = (Hashtable<String, Object>) client.execute(
                     "filemgr.getElementByName", argList);
         } catch (XmlRpcException e) {
             throw new ValidationLayerException(e);
@@ -968,10 +969,10 @@ public class XmlRpcFileManagerClient {
         argList.add(elementName);
         argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
 
-        Map<String, Object> elementHash;
+        Hashtable<String, Object> elementHash;
 
         try {
-            elementHash = (Map<String, Object>) client.execute(
+            elementHash = (Hashtable<String, Object>) client.execute(
                     "filemgr.getElementByName", argList);
         } catch (XmlRpcException e) {
             throw new ValidationLayerException(e);
@@ -989,12 +990,12 @@ public class XmlRpcFileManagerClient {
     public List<QueryResult> complexQuery(ComplexQuery complexQuery)
             throws CatalogException {
         try {
-            Map<String, Object> complexQueryHash = XmlRpcStructFactory
+            Hashtable<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
+            Vector<Hashtable<String, Object>> queryResultHashVector = (Vector<Hashtable<String, Object>>) client
                     .execute("filemgr.complexQuery", argList);
             return XmlRpcStructFactory
                     .getQueryResultsFromXmlRpc(queryResultHashVector);
@@ -1015,10 +1016,10 @@ public class XmlRpcFileManagerClient {
         argList.add(queryHash);
         argList.add(typeHash);
 
-        Vector<Map<String, Object>> productVector;
+        Vector<Hashtable<String, Object>> productVector;
 
         try {
-            productVector = (Vector<Map<String, Object>>) client.execute(
+            productVector = (Vector<Hashtable<String, Object>>) client.execute(
                     "filemgr.query", argList);
         } catch (XmlRpcException e) {
             LOG.log(Level.SEVERE, e.getMessage());
@@ -1039,12 +1040,12 @@ public class XmlRpcFileManagerClient {
     @SuppressWarnings("unchecked")
     public ProductType getProductTypeByName(String productTypeName)
             throws RepositoryManagerException {
-        Map<String, Object> productTypeHash;
+        Hashtable<String, Object> productTypeHash;
         Vector<Object> argList = new Vector<Object>();
         argList.add(productTypeName);
 
         try {
-            productTypeHash = (Map<String, Object>) client.execute(
+            productTypeHash = (Hashtable<String, Object>) client.execute(
                     "filemgr.getProductTypeByName", argList);
         } catch (XmlRpcException e) {
             throw new RepositoryManagerException(e.getLocalizedMessage());
@@ -1063,12 +1064,12 @@ public class XmlRpcFileManagerClient {
     @SuppressWarnings("unchecked")
     public ProductType getProductTypeById(String productTypeId)
             throws RepositoryManagerException {
-        Map<String, Object> productTypeHash;
+        Hashtable<String, Object> productTypeHash;
         Vector<Object> argList = new Vector<Object>();
         argList.add(productTypeId);
 
         try {
-            productTypeHash = (Map<String, Object>) client.execute(
+            productTypeHash = (Hashtable<String, Object>) client.execute(
                     "filemgr.getProductTypeById", argList);
         } catch (XmlRpcException e) {
             throw new RepositoryManagerException(e);
@@ -1113,13 +1114,13 @@ public class XmlRpcFileManagerClient {
             throws CatalogException {
         Vector<Object> argList = new Vector<Object>();
 
-        Vector<Map<String, Object>> productReferenceVector;
-        Map<String, Object> productHash = XmlRpcStructFactory
+        Vector<Hashtable<String, Object>> productReferenceVector;
+        Hashtable<String, Object> productHash = XmlRpcStructFactory
                 .getXmlRpcProduct(product);
         argList.add(productHash);
 
         try {
-            productReferenceVector = (Vector<Map<String, Object>>) client
+            productReferenceVector = (Vector<Hashtable<String, Object>>) client
                     .execute("filemgr.getProductReferences", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -1139,11 +1140,11 @@ public class XmlRpcFileManagerClient {
     public Product getProductById(String productId) throws CatalogException {
         Vector<Object> argList = new Vector<Object>();
 
-        Map<String, Object> productHash;
+        Hashtable<String, Object> productHash;
         argList.add(productId);
 
         try {
-            productHash = (Map<String, Object>) client.execute(
+            productHash = (Hashtable<String, Object>) client.execute(
                     "filemgr.getProductById", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -1162,11 +1163,11 @@ public class XmlRpcFileManagerClient {
     public Product getProductByName(String productName) throws CatalogException {
         Vector<Object> argList = new Vector<Object>();
 
-        Map<String, Object> productHash;
+        Hashtable<String, Object> productHash;
         argList.add(productName);
 
         try {
-            productHash = (Map<String, Object>) client.execute(
+            productHash = (Hashtable<String, Object>) client.execute(
                     "filemgr.getProductByName", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -1186,10 +1187,10 @@ public class XmlRpcFileManagerClient {
         try {
             // ingest product
             Vector<Object> argList = new Vector<Object>();
-            Map<String, Object> productHash = XmlRpcStructFactory
+            Hashtable<String, Object> productHash = XmlRpcStructFactory
                     .getXmlRpcProduct(product);
             argList.add(productHash);
-            argList.add(metadata.getMap());
+            argList.add(metadata.getHashTable());
             argList.add(clientTransfer);
             String productId = (String) client.execute("filemgr.ingestProduct",
                     argList);
@@ -1321,7 +1322,7 @@ public class XmlRpcFileManagerClient {
     public Metadata getCatalogValues(Metadata metadata, ProductType productType)
             throws XmlRpcException, IOException {
         Vector<Object> args = new Vector<Object>();
-        args.add(metadata.getMap());
+        args.add(metadata.getHashTable());
         args.add(XmlRpcStructFactory.getXmlRpcProductType(productType));
 
         Metadata m = new Metadata();
@@ -1335,7 +1336,7 @@ public class XmlRpcFileManagerClient {
     public Metadata getOrigValues(Metadata metadata, ProductType productType)
             throws XmlRpcException, IOException {
         Vector<Object> args = new Vector<Object>();
-        args.add(metadata.getMap());
+        args.add(metadata.getHashTable());
         args.add(XmlRpcStructFactory.getXmlRpcProductType(productType));
 
         Metadata m = new Metadata();
@@ -1352,7 +1353,7 @@ public class XmlRpcFileManagerClient {
         args.add(XmlRpcStructFactory.getXmlRpcQuery(query));
         args.add(XmlRpcStructFactory.getXmlRpcProductType(productType));
         return XmlRpcStructFactory
-                .getQueryFromXmlRpc((Map<String, Object>) this.client
+                .getQueryFromXmlRpc((Hashtable<String, Object>) this.client
                         .execute("filemgr.getCatalogQuery", args));
     }
 

http://git-wip-us.apache.org/repos/asf/oodt/blob/aa5e31a6/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
----------------------------------------------------------------------
diff --git a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
index 3ce0db1..a7b4964 100644
--- a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
+++ b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
@@ -37,11 +37,13 @@ import org.apache.oodt.cas.filemgr.structs.query.filter.FilterAlgor;
 import org.apache.oodt.cas.filemgr.structs.type.TypeHandler;
 import org.apache.oodt.cas.metadata.Metadata;
 
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
 
 
 /**
@@ -80,8 +82,8 @@ public final class XmlRpcStructFactory {
         FileTransferStatus status = new FileTransferStatus();
         status.setBytesTransferred(Long.parseLong(statusHash
                 .get("bytesTransferred").toString()));
-        status.setParentProduct(getProductFromXmlRpc((Map<String, Object>) statusHash.get("parentProduct")));
-        status.setFileRef(getReferenceFromXmlRpc((Map<String, Object>) statusHash.get("fileRef")));
+        status.setParentProduct(getProductFromXmlRpc((Hashtable<String, Object>) statusHash.get("parentProduct")));
+        status.setFileRef(getReferenceFromXmlRpc((Hashtable<String, Object>) statusHash.get("fileRef")));
         return status;
     }
 
@@ -111,7 +113,17 @@ public final class XmlRpcStructFactory {
         return statuses;
     }
 
-    public static Map<String, Object> getXmlRpcProductPage(ProductPage page) {
+    public static Hashtable<String, Object> getXmlRpcProductPage(ProductPage page) {
+        Hashtable<String, Object>productPageHash = new Hashtable<String, Object>();
+        productPageHash.put("totalPages", page.getTotalPages());
+        productPageHash.put("pageNum", page.getPageNum());
+        productPageHash.put("pageSize", page.getPageSize());
+        productPageHash.put("pageProducts", getXmlRpcProductList(page
+            .getPageProducts()));
+        return productPageHash;
+    }
+
+    public static Map<String, Object> getXmlRpcProductPageMap(ProductPage page) {
         Map<String, Object>productPageHash = new ConcurrentHashMap<String, Object>();
         productPageHash.put("totalPages", page.getTotalPages());
         productPageHash.put("pageNum", page.getPageNum());
@@ -128,12 +140,36 @@ public final class XmlRpcStructFactory {
         page
                 .setPageSize((Integer) productPageHash.get("pageSize"));
         page.setTotalPages((Integer) productPageHash.get("totalPages"));
-        page.setPageProducts(getProductListFromXmlRpc((Vector<Map<String, Object>>) productPageHash
+        page.setPageProducts(getProductListFromXmlRpc((Vector<Hashtable<String, Object>>) productPageHash
                 .get("pageProducts")));
         return page;
     }
-    
-    public static Map<String, Object> getXmlRpcComplexQuery(ComplexQuery complexQuery) {
+
+    public static Hashtable<String, Object> getXmlRpcComplexQuery(ComplexQuery complexQuery) {
+        Hashtable<String, Object> complexQueryHash = getXmlRpcQuery(complexQuery);
+        if (complexQuery.getReducedProductTypeNames() != null) {
+            complexQueryHash
+                .put("reducedProductTypeNames", new Vector<String>(complexQuery.getReducedProductTypeNames()));
+        } else {
+            complexQueryHash.put("reducedProductTypeNames", new Vector<String>());
+        }
+        if (complexQuery.getReducedMetadata() != null) {
+            complexQueryHash.put("reducedMetadata", new Vector<String>(complexQuery.getReducedMetadata()));
+        } else {
+            complexQueryHash.put("reducedMetadata", new Vector<String>());
+        }
+        if (complexQuery.getSortByMetKey() != null) {
+            complexQueryHash.put("sortByMetKey", complexQuery.getSortByMetKey());
+        }
+        if (complexQuery.getToStringResultFormat() != null) {
+            complexQueryHash.put("toStringResultFormat", complexQuery.getToStringResultFormat());
+        }
+        if (complexQuery.getQueryFilter() != null) {
+            complexQueryHash.put("queryFilter", getXmlRpcQueryFilter(complexQuery.getQueryFilter()));
+        }
+        return complexQueryHash;
+    }
+    public static Map<String, Object> getXmlRpcComplexQueryMap(ComplexQuery complexQuery) {
         Map<String, Object> complexQueryHash = getXmlRpcQuery(complexQuery);
         if (complexQuery.getReducedProductTypeNames() != null) {
             complexQueryHash
@@ -157,9 +193,8 @@ public final class XmlRpcStructFactory {
         }
         return complexQueryHash;
     }
-    
     @SuppressWarnings("unchecked")
-    public static ComplexQuery getComplexQueryFromXmlRpc(Map<String, Object> complexQueryHash) {
+    public static ComplexQuery getComplexQueryFromXmlRpc(Hashtable<String, Object> complexQueryHash) {
         ComplexQuery complexQuery = new ComplexQuery();
         complexQuery.setCriteria(getQueryFromXmlRpc(complexQueryHash).getCriteria());
         if (((Vector<String>) complexQueryHash.get("reducedProductTypeNames")).size() > 0) {
@@ -176,7 +211,24 @@ public final class XmlRpcStructFactory {
         }
         return complexQuery;
     }
-    
+
+    public static ComplexQuery getComplexQueryFromXmlRpcMap(Map<String, Object> complexQueryHash) {
+        ComplexQuery complexQuery = new ComplexQuery();
+        complexQuery.setCriteria(getQueryFromXmlRpcMap(complexQueryHash).getCriteria());
+        if (((Vector<String>) complexQueryHash.get("reducedProductTypeNames")).size() > 0) {
+            complexQuery.setReducedProductTypeNames((Vector<String>) complexQueryHash.get("reducedProductTypeNames"));
+        }
+        if (((Vector<String>) complexQueryHash.get("reducedMetadata")).size() > 0) {
+            complexQuery.setReducedMetadata((Vector<String>) complexQueryHash.get("reducedMetadata"));
+        }
+        complexQuery.setSortByMetKey((String) complexQueryHash.get("sortByMetKey"));
+        complexQuery.setToStringResultFormat((String) complexQueryHash.get("toStringResultFormat"));
+        if (complexQueryHash.get("queryFilter") != null) {
+            complexQuery.setQueryFilter(
+                getQueryFilterFromXmlRpc((Map<String, Object>) complexQueryHash.get("queryFilter")));
+        }
+        return complexQuery;
+    }
     public static Map<String, Object> getXmlRpcQueryFilter(QueryFilter queryFilter) {
         Map<String, Object> queryFilterHash = new ConcurrentHashMap<String, Object>();
         queryFilterHash.put("startDateTimeMetKey", queryFilter.getStartDateTimeMetKey());
@@ -213,23 +265,48 @@ public final class XmlRpcStructFactory {
         return filterAlgor;
     }
     
-    public static Vector<Map<String, Object>> getXmlRpcQueryResults(List<QueryResult> queryResults) {
+    public static Vector<Hashtable<String, Object>> getXmlRpcQueryResults(List<QueryResult> queryResults) {
+        Vector<Hashtable<String, Object>> queryResultHashVector = new Vector<Hashtable<String, Object>>();
+        for (QueryResult queryResult : queryResults) {
+            queryResultHashVector.add(getXmlRpcQueryResult(queryResult));
+        }
+        return queryResultHashVector;
+    }
+
+    public static Vector<Map<String, Object>> getXmlRpcQueryResultsMap(List<QueryResult> queryResults) {
         Vector<Map<String, Object>> queryResultHashVector = new Vector<Map<String, Object>>();
         for (QueryResult queryResult : queryResults) {
             queryResultHashVector.add(getXmlRpcQueryResult(queryResult));
         }
         return queryResultHashVector;
     }
-    
-    public static List<QueryResult> getQueryResultsFromXmlRpc(Vector<Map<String, Object>> queryResultHashVector) {
+
+    public static List<QueryResult> getQueryResultsFromXmlRpc(Vector<Hashtable<String, Object>> queryResultHashVector) {
+        List<QueryResult> queryResults = new Vector<QueryResult>();
+        for (Hashtable<String, Object> queryResultHash : queryResultHashVector) {
+            queryResults.add(getQueryResultFromXmlRpc(queryResultHash));
+        }
+        return queryResults;
+    }
+
+    public static List<QueryResult> getQueryResultsFromXmlRpcMap(Vector<Map<String, Object>>
+                                                                   queryResultHashVector) {
         List<QueryResult> queryResults = new Vector<QueryResult>();
         for (Map<String, Object> queryResultHash : queryResultHashVector) {
             queryResults.add(getQueryResultFromXmlRpc(queryResultHash));
         }
         return queryResults;
     }
-        
-    public static Map<String, Object> getXmlRpcQueryResult(QueryResult queryResult) {
+    public static Hashtable<String, Object> getXmlRpcQueryResult(QueryResult queryResult) {
+        Hashtable<String, Object> queryResultHash = new Hashtable<String, Object>();
+        if (queryResult.getToStringFormat() != null) {
+            queryResultHash.put("toStringFormat", queryResult.getToStringFormat());
+        }
+        queryResultHash.put("product", getXmlRpcProduct(queryResult.getProduct()));
+        queryResultHash.put("metadata", queryResult.getMetadata().getMap());
+        return queryResultHash;
+    }
+    public static Map<String, Object> getXmlRpcQueryResultMap(QueryResult queryResult) {
         Map<String, Object> queryResultHash = new ConcurrentHashMap<String, Object>();
         if (queryResult.getToStringFormat() != null) {
             queryResultHash.put("toStringFormat", queryResult.getToStringFormat());
@@ -241,7 +318,7 @@ public final class XmlRpcStructFactory {
     
     @SuppressWarnings("unchecked")
     public static QueryResult getQueryResultFromXmlRpc(Map<String, Object> queryResultHash) {
-        Product product = getProductFromXmlRpc((Map<String, Object>) queryResultHash.get("product"));
+        Product product = getProductFromXmlRpc((Hashtable<String, Object>) queryResultHash.get("product"));
         Metadata metadata = new Metadata();
         metadata.addMetadata((Map<String, Object>) queryResultHash.get("metadata"));
         QueryResult queryResult = new QueryResult(product, metadata);
@@ -249,8 +326,8 @@ public final class XmlRpcStructFactory {
         return queryResult;
     }
     
-    public static Map<String, Object> getXmlRpcProduct(Product product) {
-        Map<String, Object> productHash = new ConcurrentHashMap<String, Object>();
+    public static Hashtable<String, Object> getXmlRpcProduct(Product product) {
+        Hashtable<String, Object> productHash = new Hashtable<String, Object>();
         if (product.getProductId() != null) {
            productHash.put("id", product.getProductId());
         }
@@ -277,33 +354,57 @@ public final class XmlRpcStructFactory {
         return productHash;
     }
 
-    @SuppressWarnings("unchecked")
     public static Product getProductFromXmlRpc(Map<?, ?> productHash) {
+        /*Hashtable ht = new Hashtable();
+        ht.putAll(productHash);*/
+        Product product = new Product();
+        product.setProductId((String) productHash.get("id"));
+        product.setProductName((String) productHash.get("name"));
+        if (productHash.get("type") != null) {
+            product.setProductType(getProductTypeFromXmlRpc(
+                (Hashtable<String, Object>) productHash.get("type")));
+        }
+        product.setProductStructure((String) productHash.get("structure"));
+        product.setTransferStatus((String) productHash.get("transferStatus"));
+        if (productHash.get("references") != null) {
+            product.setProductReferences(getReferencesFromXmlRpc(
+                (Vector<Hashtable<String, Object>>) productHash
+                    .get("references")));
+        }
+        if (productHash.get("rootReference") != null) {
+            product.setRootRef(getReferenceFromXmlRpc(
+                (Hashtable<String, Object>) productHash.get("rootReference")));
+        }
+        return product;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static Product getProductFromXmlRpc(Hashtable<?, ?> productHash) {
         Product product = new Product();
         product.setProductId((String) productHash.get("id"));
         product.setProductName((String) productHash.get("name"));
         if (productHash.get("type") != null) {
            product.setProductType(getProductTypeFromXmlRpc(
-                 (Map<String, Object>) productHash.get("type")));
+                 (Hashtable<String, Object>) productHash.get("type")));
         }
         product.setProductStructure((String) productHash.get("structure"));
         product.setTransferStatus((String) productHash.get("transferStatus"));
         if (productHash.get("references") != null) {
            product.setProductReferences(getReferencesFromXmlRpc(
-                 (Vector<Map<String, Object>>) productHash
+                 (Vector<Hashtable<String, Object>>) productHash
                         .get("references")));
         }
         if (productHash.get("rootReference") != null) {
            product.setRootRef(getReferenceFromXmlRpc(
-                 (Map<String, Object>) productHash.get("rootReference")));
+                 (Hashtable<String, Object>) productHash.get("rootReference")));
         }
         return product;
     }
 
-    public static List<Product> getProductListFromXmlRpc(Vector<Map<String, Object>> productVector) {
+    public static List<Product> getProductListFromXmlRpc(Vector<Hashtable<String, Object>> productVector) {
         List<Product> productList = new Vector<Product>();
 
-        for (Map<String, Object> productHash : productVector) {
+        for (Hashtable<String, Object> productHash : productVector) {
             Product product = getProductFromXmlRpc(productHash);
             productList.add(product);
         }
@@ -311,7 +412,7 @@ public final class XmlRpcStructFactory {
         return productList;
     }
 
-    public static Vector<Map<String, Object>> getXmlRpcProductList(List<Product> products) {
+    public static Vector<Map<String, Object>> getXmlRpcProductListMap(List<Product> products) {
         Vector<Map<String, Object>> productVector = new Vector<Map<String, Object>>();
 
         if (products == null) {
@@ -326,6 +427,21 @@ public final class XmlRpcStructFactory {
         return productVector;
     }
 
+    public static Vector<Hashtable<String, Object>> getXmlRpcProductList(List<Product> products) {
+        Vector<Hashtable<String, Object>> productVector = new Vector<Hashtable<String, Object>>();
+
+        if (products == null) {
+            return productVector;
+        }
+
+        for (Product product : products) {
+            Hashtable<String, Object> productHash = getXmlRpcProduct(product);
+            productVector.add(productHash);
+        }
+
+        return productVector;
+    }
+
     public static Vector<Map<String, Object>> getXmlRpcProductTypeList(List<ProductType> productTypes) {
         Vector<Map<String, Object>> productTypeVector = new Vector<Map<String, Object>>();
 
@@ -350,7 +466,7 @@ public final class XmlRpcStructFactory {
         return productTypeList;
     }
 
-    public static Map<String, Object> getXmlRpcProductType(ProductType type) {
+    public static Map<String, Object> getXmlRpcProductTypeMap(ProductType type) {
         Map<String, Object> productTypeHash = new ConcurrentHashMap<String, Object>();
         // TODO(bfoster): ProductType ID is currently required by XmlRpcFileManager.
         productTypeHash.put("id", type.getProductTypeId());
@@ -378,6 +494,34 @@ public final class XmlRpcStructFactory {
         return productTypeHash;
     }
 
+    public static Hashtable<String, Object> getXmlRpcProductType(ProductType type) {
+        Hashtable<String, Object> productTypeHash = new Hashtable<String, Object>();
+        // TODO(bfoster): ProductType ID is currently required by XmlRpcFileManager.
+        productTypeHash.put("id", type.getProductTypeId());
+        if (type.getName() != null) {
+            productTypeHash.put("name", type.getName());
+        }
+        if (type.getDescription() != null) {
+            productTypeHash.put("description", type.getDescription());
+        }
+        if (type.getProductRepositoryPath() != null) {
+            productTypeHash.put("repositoryPath",type.getProductRepositoryPath());
+        }
+        if (type.getVersioner() != null) {
+            productTypeHash.put("versionerClass", type.getVersioner());
+        }
+        if (type.getTypeMetadata() != null) {
+            productTypeHash.put("typeMetadata", type.getTypeMetadata().getHashTable());
+        }
+        if (type.getExtractors() != null) {
+            productTypeHash.put("typeExtractors", getXmlRpcTypeExtractors(type.getExtractors()));
+        }
+        if (type.getHandlers() != null) {
+            productTypeHash.put("typeHandlers", getXmlRpcTypeHandlers(type.getHandlers()));
+        }
+        return productTypeHash;
+    }
+
     @SuppressWarnings("unchecked")
     public static ProductType getProductTypeFromXmlRpc(Map<String, Object> productTypeHash) {
         ProductType type = new ProductType();
@@ -393,18 +537,29 @@ public final class XmlRpcStructFactory {
         }
         if (productTypeHash.get("typeExtractors") != null) {
             type.setExtractors(getTypeExtractorsFromXmlRpc(
-                  (Vector<Map<String, Object>>) productTypeHash
+                  (Vector<Hashtable<String, Object>>) productTypeHash
                      .get("typeExtractors")));
         }
         if (productTypeHash.get("typeHandlers") != null) {
             type.setHandlers(getTypeHandlersFromXmlRpc(
-                  (Vector<Map<String, Object>>) productTypeHash
+                  (Vector<Hashtable<String, Object>>) productTypeHash
                         .get("typeHandlers")));
         }
         return type;
     }
 
-    public static Vector<Map<String, Object>> getXmlRpcTypeExtractors(List<ExtractorSpec> extractors) {
+    public static Vector<Hashtable<String, Object>> getXmlRpcTypeExtractors(List<ExtractorSpec> extractors) {
+        Vector<Hashtable<String, Object>> extractorsVector = new Vector<Hashtable<String, Object>>();
+
+        if (extractors != null && extractors.size() > 0) {
+            for (ExtractorSpec spec : extractors) {
+                extractorsVector.add(getXmlRpcExtractorSpec(spec));
+            }
+        }
+
+        return extractorsVector;
+    }
+    public static Vector<Map<String, Object>> getXmlRpcTypeExtractorsMap(List<ExtractorSpec> extractors) {
         Vector<Map<String, Object>> extractorsVector = new Vector<Map<String, Object>>();
 
         if (extractors != null && extractors.size() > 0) {
@@ -416,15 +571,26 @@ public final class XmlRpcStructFactory {
         return extractorsVector;
     }
 
-    public static Map<String, Object> getXmlRpcExtractorSpec(ExtractorSpec spec) {
-        Map<String, Object> extractorHash = new ConcurrentHashMap<String, Object>();
+    public static Hashtable<String, Object> getXmlRpcExtractorSpec(ExtractorSpec spec) {
+        Hashtable<String, Object> extractorHash = new Hashtable<String, Object>();
         extractorHash.put("className", spec.getClassName());
         extractorHash.put("config",
                 getXmlRpcProperties(spec.getConfiguration()));
         return extractorHash;
     }
-    
-    public static Vector<Map<String, Object>> getXmlRpcTypeHandlers(List<TypeHandler> typeHandlers) {
+
+    public static Vector<Hashtable<String, Object>> getXmlRpcTypeHandlers(List<TypeHandler> typeHandlers) {
+        Vector<Hashtable<String, Object>> handlersVector = new Vector<Hashtable<String, Object>>();
+
+        if (typeHandlers != null && typeHandlers.size() > 0) {
+            for (TypeHandler typeHandler : typeHandlers) {
+                handlersVector.add(getXmlRpcTypeHandler(typeHandler));
+            }
+        }
+
+        return handlersVector;
+    }
+    public static Vector<Map<String, Object>> getXmlRpcTypeHandlersMap(List<TypeHandler> typeHandlers) {
         Vector<Map<String, Object>> handlersVector = new Vector<Map<String, Object>>();
 
         if (typeHandlers != null && typeHandlers.size() > 0) {
@@ -435,8 +601,17 @@ public final class XmlRpcStructFactory {
 
         return handlersVector;
     }
-    
-    public static Map<String, Object> getXmlRpcTypeHandler(TypeHandler typeHandler) {
+
+    public static Hashtable<String, Object> getXmlRpcTypeHandler(TypeHandler typeHandler) {
+        Hashtable<String, Object> handlerHash = new Hashtable<String, Object>();
+        handlerHash.put("className", typeHandler != null ?
+                                     typeHandler.getClass().getCanonicalName():"");
+        handlerHash.put("elementName", typeHandler != null ?
+                                       typeHandler.getElementName():"");
+        return handlerHash;
+    }
+
+    public static Map<String, Object> getXmlRpcTypeHandlerMap(TypeHandler typeHandler) {
         Map<String, Object> handlerHash = new ConcurrentHashMap<String, Object>();
         handlerHash.put("className", typeHandler != null ? 
             typeHandler.getClass().getCanonicalName():"");
@@ -445,11 +620,11 @@ public final class XmlRpcStructFactory {
         return handlerHash;
     }
 
-    public static List<ExtractorSpec> getTypeExtractorsFromXmlRpc(Vector<Map<String, Object>> extractorsVector) {
+    public static List<ExtractorSpec> getTypeExtractorsFromXmlRpc(Vector<Hashtable<String, Object>> extractorsVector) {
         List<ExtractorSpec> extractors = new Vector<ExtractorSpec>();
 
         if (extractorsVector != null && extractorsVector.size() > 0) {
-            for (Map<String, Object> extractorSpecHash : extractorsVector) {
+            for (Hashtable<String, Object> extractorSpecHash : extractorsVector) {
                 extractors.add(getExtractorSpecFromXmlRpc(extractorSpecHash));
             }
         }
@@ -463,16 +638,16 @@ public final class XmlRpcStructFactory {
         ExtractorSpec spec = new ExtractorSpec();
         spec.setClassName((String) extractorSpecHash.get("className"));
         spec
-                .setConfiguration(getPropertiesFromXmlRpc((Map<String, String>) extractorSpecHash
+                .setConfiguration(getPropertiesFromXmlRpc((Hashtable<String, String>) extractorSpecHash
                         .get("config")));
         return spec;
     }
     
-    public static List<TypeHandler> getTypeHandlersFromXmlRpc(Vector<Map<String, Object>> handlersVector) {
+    public static List<TypeHandler> getTypeHandlersFromXmlRpc(Vector<Hashtable<String, Object>> handlersVector) {
         List<TypeHandler> handlers = new Vector<TypeHandler>();
 
         if (handlersVector != null && handlersVector.size() > 0) {
-            for (Map<String, Object> typeHandlerHash : handlersVector) {
+            for (Hashtable<String, Object> typeHandlerHash : handlersVector) {
                 handlers.add(getTypeHandlerFromXmlRpc(typeHandlerHash));
             }
         }
@@ -481,7 +656,7 @@ public final class XmlRpcStructFactory {
     }
     
     public static TypeHandler getTypeHandlerFromXmlRpc(
-            Map<String, Object> typeHandlerHash) {
+            Hashtable<String, Object> typeHandlerHash) {
         TypeHandler typeHandler = GenericFileManagerObjectFactory
             .getTypeHandlerFromClassName((String) typeHandlerHash.get("className"));
         if(typeHandler != null) {
@@ -495,7 +670,7 @@ public final class XmlRpcStructFactory {
 
         if (propHash != null && propHash.keySet().size() > 0) {
             for (Map.Entry<String, String> propName : propHash.entrySet()) {
-                String propValue = propHash.get(propName);
+                String propValue = propName.getValue();
                 props.setProperty(propName.getKey(), propValue);
             }
         }
@@ -503,8 +678,8 @@ public final class XmlRpcStructFactory {
         return props;
     }
 
-    public static Map<String, String> getXmlRpcProperties(Properties props) {
-        Map<String, String> propHash = new ConcurrentHashMap<String, String>();
+    public static Hashtable<String, String> getXmlRpcProperties(Properties props) {
+        Hashtable<String, String> propHash = new Hashtable<String, String>();
 
         if (props != null && props.keySet().size() > 0) {
             for (Object o : props.keySet()) {
@@ -517,7 +692,7 @@ public final class XmlRpcStructFactory {
         return propHash;
     }
 
-    public static Vector<Map<String, Object>> getXmlRpcReferences(List<Reference> references) {
+    public static Vector<Map<String, Object>> getXmlRpcReferencesMap(List<Reference> references) {
         Vector<Map<String, Object>> refVector = new Vector<Map<String, Object>>();
 
         if (references == null) {
@@ -532,17 +707,31 @@ public final class XmlRpcStructFactory {
         return refVector;
     }
 
-    public static List<Reference> getReferencesFromXmlRpc(Vector<Map<String, Object>> referenceVector) {
+    public static Vector<Hashtable<String, Object>> getXmlRpcReferences(List<Reference> references) {
+        Vector<Hashtable<String, Object>> refVector = new Vector<Hashtable<String, Object>>();
+
+        if (references == null) {
+            return refVector;
+        }
+
+        for (Reference reference : references) {
+            Hashtable<String, Object> refHash = getXmlRpcReference(reference);
+            refVector.add(refHash);
+        }
+
+        return refVector;
+    }
+    public static List<Reference> getReferencesFromXmlRpc(Vector<Hashtable<String, Object>> referenceVector) {
         List<Reference> references = new Vector<Reference>();
-        for (Map<String, Object> aReferenceVector : referenceVector) {
+        for (Hashtable<String, Object> aReferenceVector : referenceVector) {
             Reference r = getReferenceFromXmlRpc(aReferenceVector);
             references.add(r);
         }
         return references;
     }
 
-    public static Map<String, Object> getXmlRpcReference(Reference reference) {
-        Map<String, Object> referenceHash = new ConcurrentHashMap<String, Object>();
+    public static Hashtable<String, Object> getXmlRpcReference(Reference reference) {
+        Hashtable<String, Object> referenceHash = new Hashtable<String, Object>();
         referenceHash.put("origReference", reference.getOrigReference());
         referenceHash.put("dataStoreReference", reference
                 .getDataStoreReference() != null ? reference
@@ -564,26 +753,45 @@ public final class XmlRpcStructFactory {
         return reference;
     }
 
+    public static Reference getReferenceFromXmlRpcHashtable(Hashtable<String, Object> referenceHash) {
+        Reference reference = new Reference();
+        reference.setDataStoreReference((String) referenceHash
+            .get("dataStoreReference"));
+        reference.setOrigReference((String) referenceHash.get("origReference"));
+        reference.setFileSize(Long.parseLong(referenceHash.get("fileSize").toString()));
+        reference.setMimeType((String) referenceHash.get("mimeType"));
+        return reference;
+    }
+
+    public static Vector<Hashtable<String, Object>> getXmlRpcElementListHashtable(List<Element> elementList) {
+        Vector<Hashtable<String, Object>> elementVector = new Vector<Hashtable<String, Object>>(elementList.size());
+        for (Element element : elementList) {
+            Hashtable<String, Object> elementHash = getXmlRpcElementHashTable(element);
+            elementVector.add(elementHash);
+        }
+        return elementVector;
+    }
+
     public static Vector<Map<String, Object>> getXmlRpcElementList(List<Element> elementList) {
         Vector<Map<String, Object>> elementVector = new Vector<Map<String, Object>>(elementList.size());
         for (Element element : elementList) {
-            Map<String, Object> elementHash = getXmlRpcElement(element);
+            HashMap<String, Object> elementHash = getXmlRpcElement(element);
             elementVector.add(elementHash);
         }
         return elementVector;
     }
 
-    public static List<Element> getElementListFromXmlRpc(Vector<Map<String, Object>> elementVector) {
+    public static List<Element> getElementListFromXmlRpc(Vector<Hashtable<String, Object>> elementVector) {
         List<Element> elementList = new Vector<Element>(elementVector.size());
-        for (Map<String, Object> elementHash : elementVector) {
+        for (Hashtable<String, Object> elementHash : elementVector) {
             Element element = getElementFromXmlRpc(elementHash);
             elementList.add(element);
         }
         return elementList;
     }
 
-    public static Map<String, Object> getXmlRpcElement(Element element) {
-        Map<String, Object> elementHash = new ConcurrentHashMap<String, Object>();
+    public static HashMap<String, Object> getXmlRpcElement(Element element) {
+        HashMap<String, Object> elementHash = new HashMap<String, Object>();
 
         elementHash.put("id", element.getElementId());
         elementHash.put("name", element.getElementName());
@@ -595,8 +803,20 @@ public final class XmlRpcStructFactory {
 
         return elementHash;
     }
+    public static Hashtable<String, Object> getXmlRpcElementHashTable(Element element) {
+        Hashtable<String, Object> elementHash = new Hashtable<String, Object>();
 
-    public static Element getElementFromXmlRpc(Map<String, Object> elementHash) {
+        elementHash.put("id", element.getElementId());
+        elementHash.put("name", element.getElementName());
+        elementHash.put("dcElement", element.getDCElement() != null ? element
+            .getDCElement() : "");
+        elementHash.put("description",
+            element.getDescription() != null ? element.getDescription()
+                                             : "");
+
+        return elementHash;
+    }
+    public static Element getElementFromXmlRpc(Hashtable<String, Object> elementHash) {
         Element element = new Element();
         element.setElementId((String) elementHash.get("id"));
         element.setElementName((String) elementHash.get("name"));
@@ -606,14 +826,14 @@ public final class XmlRpcStructFactory {
         return element;
     }
 
-    public static Map<String, Object> getXmlRpcQuery(Query query) {
-        Map<String, Object> queryHash = new ConcurrentHashMap<String, Object>();
-        Vector<Map<String, Object>> criteriaVector = getXmlRpcQueryCriteriaList(query.getCriteria());
+    public static Hashtable<String, Object> getXmlRpcQuery(Query query) {
+        Hashtable<String, Object> queryHash = new Hashtable<String, Object>();
+        Vector<Hashtable<String, Object>> criteriaVector = getXmlRpcQueryCriteriaList(query.getCriteria());
         queryHash.put("criteria", criteriaVector);
         return queryHash;
     }
 
-    public static Query getQueryFromXmlRpc(Map<String, Object> queryHash) {
+    public static Query getQueryFromXmlRpc(Hashtable<String, Object> queryHash) {
         Query query = new Query();
         @SuppressWarnings("unchecked")
         List<QueryCriteria> criteria = getQueryCriteriaListFromXmlRpc((Vector<Map<String, Object>>) queryHash
@@ -622,10 +842,19 @@ public final class XmlRpcStructFactory {
         return query;
     }
 
-    public static Vector<Map<String, Object>> getXmlRpcQueryCriteriaList(List<QueryCriteria> criteriaList) {
-        Vector<Map<String, Object>> criteriaVector = new Vector<Map<String, Object>>(criteriaList.size());
+    public static Query getQueryFromXmlRpcMap(Map<String, Object> queryHash) {
+        Query query = new Query();
+        @SuppressWarnings("unchecked")
+        List<QueryCriteria> criteria = getQueryCriteriaListFromXmlRpc((Vector<Map<String, Object>>) queryHash
+            .get("criteria"));
+        query.setCriteria(criteria);
+        return query;
+    }
+
+    public static Vector<Hashtable<String, Object>> getXmlRpcQueryCriteriaList(List<QueryCriteria> criteriaList) {
+        Vector<Hashtable<String, Object>> criteriaVector = new Vector<Hashtable<String, Object>>(criteriaList.size());
         for (QueryCriteria criteria : criteriaList) {
-            Map<String, Object> criteriaHash = getXmlRpcQueryCriteria(criteria);
+            Hashtable<String, Object> criteriaHash = getXmlRpcQueryCriteria(criteria);
             criteriaVector.add(criteriaHash);
         }
 
@@ -642,8 +871,8 @@ public final class XmlRpcStructFactory {
         return criteriaList;
     }
 
-    public static Map<String, Object> getXmlRpcQueryCriteria(QueryCriteria criteria) {
-        Map<String, Object> criteriaHash = new ConcurrentHashMap<String, Object>();
+    public static Hashtable<String, Object> getXmlRpcQueryCriteria(QueryCriteria criteria) {
+        Hashtable<String, Object> criteriaHash = new Hashtable<String, Object>();
         criteriaHash.put("class",criteria.getClass().getCanonicalName());
         
         if(criteria instanceof TermQueryCriteria){  
@@ -659,11 +888,11 @@ public final class XmlRpcStructFactory {
         } else if(criteria instanceof BooleanQueryCriteria){
             BooleanQueryCriteria boolQuery = (BooleanQueryCriteria) criteria;
             criteriaHash.put("operator", boolQuery.getOperator());
-            Vector<Map<String, Object>> termsHash = new Vector<Map<String, Object>>();
+            Vector<Hashtable<String, Object>> termsHash = new Vector<Hashtable<String, Object>>();
             List<QueryCriteria> terms = boolQuery.getTerms();
 
             for (QueryCriteria term : terms) {
-                Map<String, Object> termHash = getXmlRpcQueryCriteria(term);
+                Hashtable<String, Object> termHash = getXmlRpcQueryCriteria(term);
                 termsHash.add(termHash);
             }
             criteriaHash.put("terms", termsHash);

http://git-wip-us.apache.org/repos/asf/oodt/blob/aa5e31a6/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java b/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
index 44b9220..73a21dc 100644
--- a/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
+++ b/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
@@ -405,7 +405,7 @@ public class Metadata {
    * combined.
    */
   @Deprecated
-  public void addMetadata(ConcurrentHashMap<String, Object> metadata, boolean replace) {
+  public void addMetadata(Map<String, Object> metadata, boolean replace) {
     // for back compat: the old method allowed us to give it a
     // Map<String,String> and it still worked
 	for (Map.Entry<String, Object> key : metadata.entrySet()) {
@@ -419,19 +419,6 @@ public class Metadata {
     }
   }
 
-  public void addMetadata(Map<String, Object> metadata, boolean replace) {
-    // for back compat: the old method allowed us to give it a
-    // Map<String,String> and it still worked
-    for (Map.Entry<String, Object> key : metadata.entrySet()) {
-      List<String> vals = (key.getValue() instanceof List) ? (List<String>) key.getValue()
-                                                           : Collections.singletonList(key.getValue().toString());
-      if (replace) {
-        this.replaceMetadata(key.getKey(), vals);
-      } else {
-        this.addMetadata(key.getKey(), vals);
-      }
-    }
-  }
 
   public void replaceMetadata(Map<String, Object> metadata) {
     this.root = this.createNewRoot();

http://git-wip-us.apache.org/repos/asf/oodt/blob/aa5e31a6/resource/src/main/java/org/apache/oodt/cas/resource/system/XmlRpcResourceManager.java
----------------------------------------------------------------------
diff --git a/resource/src/main/java/org/apache/oodt/cas/resource/system/XmlRpcResourceManager.java b/resource/src/main/java/org/apache/oodt/cas/resource/system/XmlRpcResourceManager.java
index c767bf3..dbba32c 100644
--- a/resource/src/main/java/org/apache/oodt/cas/resource/system/XmlRpcResourceManager.java
+++ b/resource/src/main/java/org/apache/oodt/cas/resource/system/XmlRpcResourceManager.java
@@ -58,9 +58,6 @@ import java.util.logging.Logger;
  */
 public class XmlRpcResourceManager {
 
-    /* the port to run the XML RPC web server on, default is 2000 */
-    private int webServerPort = 2000;
-
     /* our log stream */
     private Logger LOG = Logger
             .getLogger(XmlRpcResourceManager.class.getName());
@@ -93,10 +90,10 @@ public class XmlRpcResourceManager {
         // start up the scheduler
         new Thread(scheduler).start();
 
-        webServerPort = port;
+
 
         // start up the web server
-        webServer = new WebServer(webServerPort);
+        webServer = new WebServer(port);
         webServer.addHandler("resourcemgr", this);
         webServer.start();
 


[3/6] oodt git commit: OODT-917 alter XMLRPC interface to support more generic map types where suitable

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/oodt/blob/8705ccf4/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
----------------------------------------------------------------------
diff --git a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
index d10ef2a..bf15529 100644
--- a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
+++ b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
@@ -50,784 +50,704 @@ import java.util.concurrent.ConcurrentHashMap;
  * @author mattmann
  * @author bfoster
  * @version $Revision$
- * 
- * <p>
- * A factory class for creating File Manager structures suitable for transfer
- * over the XML-RPC pipe, and for reading objects from the XML-RPC pipe into
- * File Manager structs.
- * </p>
- * 
+ *          <p/>
+ *          <p> A factory class for creating File Manager structures suitable for transfer over the XML-RPC pipe, and
+ *          for reading objects from the XML-RPC pipe into File Manager structs. </p>
  */
 public final class XmlRpcStructFactory {
 
-    private XmlRpcStructFactory() throws InstantiationException {
-        throw new InstantiationException(
-                "Don't instantiate XmlRpcStructFactories!");
-    }
-
-    public static Map<String, Object> getXmlRpcFileTransferStatus(
-            FileTransferStatus status) {
-        Map<String, Object> statusHash = new Hashtable<String, Object>();
-        statusHash.put("bytesTransferred",Long.toString(status
-                .getBytesTransferred()));
-        statusHash.put("parentProduct", getXmlRpcProduct(status
-                .getParentProduct()));
-        statusHash.put("fileRef", getXmlRpcReference(status.getFileRef()));
-        return statusHash;
-    }
-
+  private XmlRpcStructFactory() throws InstantiationException {
+    throw new InstantiationException(
+        "Don't instantiate XmlRpcStructFactories!");
+  }
+
+  public static Map<String, Object> getXmlRpcFileTransferStatus(
+      FileTransferStatus status) {
+    Map<String, Object> statusHash = new Hashtable<String, Object>();
+    statusHash.put("bytesTransferred", Long.toString(status
+        .getBytesTransferred()));
+    statusHash.put("parentProduct", getXmlRpcProduct(status
+        .getParentProduct()));
+    statusHash.put("fileRef", getXmlRpcReference(status.getFileRef()));
+    return statusHash;
+  }
+
+  @SuppressWarnings("unchecked")
+  public static FileTransferStatus getFileTransferStatusFromXmlRpc(
+      Map<String, Object> statusHash) {
+    FileTransferStatus status = new FileTransferStatus();
+    status.setBytesTransferred(Long.parseLong(statusHash
+        .get("bytesTransferred").toString()));
+    status.setParentProduct(getProductFromXmlRpc((Hashtable<String, Object>) statusHash.get("parentProduct")));
+    status.setFileRef(getReferenceFromXmlRpc((Hashtable<String, Object>) statusHash.get("fileRef")));
+    return status;
+  }
+
+  public static Vector<Map<String, Object>> getXmlRpcFileTransferStatuses(List<FileTransferStatus> statuses) {
+    Vector<Map<String, Object>> statusVector = new Vector<Map<String, Object>>();
+
+    if (statuses != null && statuses.size() > 0) {
+
+      for (FileTransferStatus status : statuses) {
+        statusVector.add(getXmlRpcFileTransferStatus(status));
+      }
+    }
+
+    return statusVector;
+  }
+
+  public static List<FileTransferStatus> getFileTransferStatusesFromXmlRpc(Vector<Map<String, Object>> statusVector) {
+    List<FileTransferStatus> statuses = new Vector<FileTransferStatus>();
+
+    if (statusVector != null && statusVector.size() > 0) {
+      for (Map<String, Object> statusHash : statusVector) {
+        FileTransferStatus status = getFileTransferStatusFromXmlRpc(statusHash);
+        statuses.add(status);
+      }
+    }
+
+    return statuses;
+  }
+
+  public static Map<String, Object> getXmlRpcProductPage(ProductPage page) {
+    Hashtable<String, Object> productPageHash = new Hashtable<String, Object>();
+    productPageHash.put("totalPages", page.getTotalPages());
+    productPageHash.put("pageNum", page.getPageNum());
+    productPageHash.put("pageSize", page.getPageSize());
+    productPageHash.put("pageProducts", getXmlRpcProductList(page
+        .getPageProducts()));
+    return productPageHash;
+  }
+
+  @SuppressWarnings("unchecked")
+  public static ProductPage getProductPageFromXmlRpc(Map<String, Object> productPageHash) {
+    ProductPage page = new ProductPage();
+    page.setPageNum((Integer) productPageHash.get("pageNum"));
+    page
+        .setPageSize((Integer) productPageHash.get("pageSize"));
+    page.setTotalPages((Integer) productPageHash.get("totalPages"));
+    page.setPageProducts(getProductListFromXmlRpc((Vector<Map<String, Object>>) productPageHash
+        .get("pageProducts")));
+    return page;
+  }
+
+  public static Map<String, Object> getXmlRpcComplexQuery(ComplexQuery complexQuery) {
+    Map<String, Object> complexQueryHash = getXmlRpcQuery(complexQuery);
+    if (complexQuery.getReducedProductTypeNames() != null) {
+      complexQueryHash
+          .put("reducedProductTypeNames", new Vector<String>(complexQuery.getReducedProductTypeNames()));
+    } else {
+      complexQueryHash.put("reducedProductTypeNames", new Vector<String>());
+    }
+    if (complexQuery.getReducedMetadata() != null) {
+      complexQueryHash.put("reducedMetadata", new Vector<String>(complexQuery.getReducedMetadata()));
+    } else {
+      complexQueryHash.put("reducedMetadata", new Vector<String>());
+    }
+    if (complexQuery.getSortByMetKey() != null) {
+      complexQueryHash.put("sortByMetKey", complexQuery.getSortByMetKey());
+    }
+    if (complexQuery.getToStringResultFormat() != null) {
+      complexQueryHash.put("toStringResultFormat", complexQuery.getToStringResultFormat());
+    }
+    if (complexQuery.getQueryFilter() != null) {
+      complexQueryHash.put("queryFilter", getXmlRpcQueryFilter(complexQuery.getQueryFilter()));
+    }
+    return complexQueryHash;
+  }
+
+  @SuppressWarnings("unchecked")
+  public static ComplexQuery getComplexQueryFromXmlRpc(Map<String, Object> complexQueryHash) {
+    ComplexQuery complexQuery = new ComplexQuery();
+    complexQuery.setCriteria(getQueryFromXmlRpc(complexQueryHash).getCriteria());
+    if (((Vector<String>) complexQueryHash.get("reducedProductTypeNames")).size() > 0) {
+      complexQuery.setReducedProductTypeNames((Vector<String>) complexQueryHash.get("reducedProductTypeNames"));
+    }
+    if (((Vector<String>) complexQueryHash.get("reducedMetadata")).size() > 0) {
+      complexQuery.setReducedMetadata((Vector<String>) complexQueryHash.get("reducedMetadata"));
+    }
+    complexQuery.setSortByMetKey((String) complexQueryHash.get("sortByMetKey"));
+    complexQuery.setToStringResultFormat((String) complexQueryHash.get("toStringResultFormat"));
+    if (complexQueryHash.get("queryFilter") != null) {
+      complexQuery.setQueryFilter(
+          getQueryFilterFromXmlRpc((Map<String, Object>) complexQueryHash.get("queryFilter")));
+    }
+    return complexQuery;
+  }
+
+  public static Map<String, Object> getXmlRpcQueryFilter(QueryFilter queryFilter) {
+    Map<String, Object> queryFilterHash = new ConcurrentHashMap<String, Object>();
+    queryFilterHash.put("startDateTimeMetKey", queryFilter.getStartDateTimeMetKey());
+    queryFilterHash.put("endDateTimeMetKey", queryFilter.getEndDateTimeMetKey());
+    queryFilterHash.put("priorityMetKey", queryFilter.getPriorityMetKey());
+    queryFilterHash.put("filterAlgor", getXmlRpcFilterAlgor(queryFilter.getFilterAlgor()));
+    queryFilterHash.put("versionConverterClass", queryFilter.getConverter().getClass().getCanonicalName());
+    return queryFilterHash;
+  }
+
+  public static QueryFilter getQueryFilterFromXmlRpc(Map<String, Object> queryFilterHash) {
+    String startDateTimeMetKey = (String) queryFilterHash.get("startDateTimeMetKey");
+    String endDateTimeMetKey = (String) queryFilterHash.get("endDateTimeMetKey");
+    String priorityMetKey = (String) queryFilterHash.get("priorityMetKey");
     @SuppressWarnings("unchecked")
-    public static FileTransferStatus getFileTransferStatusFromXmlRpc(
-            Map<String, Object> statusHash) {
-        FileTransferStatus status = new FileTransferStatus();
-        status.setBytesTransferred(Long.parseLong(statusHash
-                .get("bytesTransferred").toString()));
-        status.setParentProduct(getProductFromXmlRpc((Hashtable<String, Object>) statusHash.get("parentProduct")));
-        status.setFileRef(getReferenceFromXmlRpc((Hashtable<String, Object>) statusHash.get("fileRef")));
-        return status;
-    }
-
-    public static Vector<Map<String, Object>> getXmlRpcFileTransferStatuses(List<FileTransferStatus> statuses) {
-        Vector<Map<String, Object>> statusVector = new Vector<Map<String, Object>>();
-
-        if (statuses != null && statuses.size() > 0) {
-
-            for (FileTransferStatus status : statuses) {
-                statusVector.add(getXmlRpcFileTransferStatus(status));
-            }
-        }
+    FilterAlgor filterAlgor = getFilterAlgorFromXmlRpc((Map<String, Object>) queryFilterHash.get("filterAlgor"));
+    QueryFilter queryFilter = new QueryFilter(startDateTimeMetKey, endDateTimeMetKey, priorityMetKey, filterAlgor);
+    queryFilter.setConverter(GenericFileManagerObjectFactory
+        .getVersionConverterFromClassName((String) queryFilterHash.get("versionConverterClass")));
+    return queryFilter;
+  }
+
+  public static Map<String, Object> getXmlRpcFilterAlgor(FilterAlgor filterAlgor) {
+    Map<String, Object> filterAlgorHash = new ConcurrentHashMap<String, Object>();
+    filterAlgorHash.put("class", filterAlgor.getClass().getCanonicalName());
+    filterAlgorHash.put("epsilon", Long.toString(filterAlgor.getEpsilon()));
+    return filterAlgorHash;
+  }
+
+  public static FilterAlgor getFilterAlgorFromXmlRpc(Map<String, Object> filterAlgorHash) {
+    FilterAlgor filterAlgor =
+        GenericFileManagerObjectFactory.getFilterAlgorFromClassName((String) filterAlgorHash.get("class"));
+    if (filterAlgor != null) {
+      filterAlgor.setEpsilon(Long.parseLong((String) filterAlgorHash.get("epsilon")));
+    }
+    return filterAlgor;
+  }
+
+  public static Vector<Map<String, Object>> getXmlRpcQueryResults(List<QueryResult> queryResults) {
+    Vector<Map<String, Object>> queryResultHashVector = new Vector<Map<String, Object>>();
+    for (QueryResult queryResult : queryResults) {
+      queryResultHashVector.add(getXmlRpcQueryResult(queryResult));
+    }
+    return queryResultHashVector;
+  }
 
-        return statusVector;
+  public static List<QueryResult> getQueryResultsFromXmlRpc(Vector<Map<String, Object>> queryResultHashVector) {
+    List<QueryResult> queryResults = new Vector<QueryResult>();
+    for (Map<String, Object> queryResultHash : queryResultHashVector) {
+      queryResults.add(getQueryResultFromXmlRpc(queryResultHash));
     }
+    return queryResults;
+  }
 
-    public static List<FileTransferStatus> getFileTransferStatusesFromXmlRpc(Vector<Map<String, Object>> statusVector) {
-        List<FileTransferStatus> statuses = new Vector<FileTransferStatus>();
-
-        if (statusVector != null && statusVector.size() > 0) {
-            for (Map<String, Object> statusHash : statusVector) {
-                FileTransferStatus status = getFileTransferStatusFromXmlRpc(statusHash);
-                statuses.add(status);
-            }
-        }
-
-        return statuses;
+  public static Map<String, Object> getXmlRpcQueryResult(QueryResult queryResult) {
+    Hashtable<String, Object> queryResultHash = new Hashtable<String, Object>();
+    if (queryResult.getToStringFormat() != null) {
+      queryResultHash.put("toStringFormat", queryResult.getToStringFormat());
     }
+    queryResultHash.put("product", getXmlRpcProduct(queryResult.getProduct()));
+    queryResultHash.put("metadata", queryResult.getMetadata().getHashTable());
+    return queryResultHash;
+  }
 
-    public static Map<String, Object> getXmlRpcProductPage(ProductPage page) {
-        Hashtable<String, Object>productPageHash = new Hashtable<String, Object>();
-        productPageHash.put("totalPages", page.getTotalPages());
-        productPageHash.put("pageNum", page.getPageNum());
-        productPageHash.put("pageSize", page.getPageSize());
-        productPageHash.put("pageProducts", getXmlRpcProductList(page
-            .getPageProducts()));
-        return productPageHash;
-    }
 
-    @SuppressWarnings("unchecked")
-    public static ProductPage getProductPageFromXmlRpc(Map<String, Object> productPageHash) {
-        ProductPage page = new ProductPage();
-        page.setPageNum((Integer) productPageHash.get("pageNum"));
-        page
-                .setPageSize((Integer) productPageHash.get("pageSize"));
-        page.setTotalPages((Integer) productPageHash.get("totalPages"));
-        page.setPageProducts(getProductListFromXmlRpc((Vector<Map<String, Object>>) productPageHash
-                .get("pageProducts")));
-        return page;
-    }
-
-    public static Map<String, Object> getXmlRpcComplexQuery(ComplexQuery complexQuery) {
-        Map<String, Object> complexQueryHash = getXmlRpcQuery(complexQuery);
-        if (complexQuery.getReducedProductTypeNames() != null) {
-            complexQueryHash
-                .put("reducedProductTypeNames", new Vector<String>(complexQuery.getReducedProductTypeNames()));
-        } else {
-            complexQueryHash.put("reducedProductTypeNames", new Vector<String>());
-        }
-        if (complexQuery.getReducedMetadata() != null) {
-            complexQueryHash.put("reducedMetadata", new Vector<String>(complexQuery.getReducedMetadata()));
-        } else {
-            complexQueryHash.put("reducedMetadata", new Vector<String>());
-        }
-        if (complexQuery.getSortByMetKey() != null) {
-            complexQueryHash.put("sortByMetKey", complexQuery.getSortByMetKey());
-        }
-        if (complexQuery.getToStringResultFormat() != null) {
-            complexQueryHash.put("toStringResultFormat", complexQuery.getToStringResultFormat());
-        }
-        if (complexQuery.getQueryFilter() != null) {
-            complexQueryHash.put("queryFilter", getXmlRpcQueryFilter(complexQuery.getQueryFilter()));
-        }
-        return complexQueryHash;
-    }
+  @SuppressWarnings("unchecked")
+  public static QueryResult getQueryResultFromXmlRpc(Map<String, Object> queryResultHash) {
+    Product product = getProductFromXmlRpc((Map<String, Object>) queryResultHash.get("product"));
+    Metadata metadata = new Metadata();
+    metadata.addMetadata((Map<String, Object>) queryResultHash.get("metadata"));
+    QueryResult queryResult = new QueryResult(product, metadata);
+    queryResult.setToStringFormat((String) queryResultHash.get("toStringFormat"));
+    return queryResult;
+  }
 
-    @SuppressWarnings("unchecked")
-    public static ComplexQuery getComplexQueryFromXmlRpc(Map<String, Object> complexQueryHash) {
-        ComplexQuery complexQuery = new ComplexQuery();
-        complexQuery.setCriteria(getQueryFromXmlRpc(complexQueryHash).getCriteria());
-        if (((Vector<String>) complexQueryHash.get("reducedProductTypeNames")).size() > 0) {
-            complexQuery.setReducedProductTypeNames((Vector<String>) complexQueryHash.get("reducedProductTypeNames"));
-        }
-        if (((Vector<String>) complexQueryHash.get("reducedMetadata")).size() > 0) {
-            complexQuery.setReducedMetadata((Vector<String>) complexQueryHash.get("reducedMetadata"));
-        }
-        complexQuery.setSortByMetKey((String) complexQueryHash.get("sortByMetKey"));
-        complexQuery.setToStringResultFormat((String) complexQueryHash.get("toStringResultFormat"));
-        if (complexQueryHash.get("queryFilter") != null) {
-            complexQuery.setQueryFilter(
-                getQueryFilterFromXmlRpc((Map<String, Object>) complexQueryHash.get("queryFilter")));
-        }
-        return complexQuery;
+  public static Map<String, Object> getXmlRpcProduct(Product product) {
+    Map<String, Object> productHash = new Hashtable<String, Object>();
+    if (product.getProductId() != null) {
+      productHash.put("id", product.getProductId());
     }
-
-    public static ComplexQuery getComplexQueryFromXmlRpcMap(Map<String, Object> complexQueryHash) {
-        ComplexQuery complexQuery = new ComplexQuery();
-        complexQuery.setCriteria(getQueryFromXmlRpcMap(complexQueryHash).getCriteria());
-        if (((Vector<String>) complexQueryHash.get("reducedProductTypeNames")).size() > 0) {
-            complexQuery.setReducedProductTypeNames((Vector<String>) complexQueryHash.get("reducedProductTypeNames"));
-        }
-        if (((Vector<String>) complexQueryHash.get("reducedMetadata")).size() > 0) {
-            complexQuery.setReducedMetadata((Vector<String>) complexQueryHash.get("reducedMetadata"));
-        }
-        complexQuery.setSortByMetKey((String) complexQueryHash.get("sortByMetKey"));
-        complexQuery.setToStringResultFormat((String) complexQueryHash.get("toStringResultFormat"));
-        if (complexQueryHash.get("queryFilter") != null) {
-            complexQuery.setQueryFilter(
-                getQueryFilterFromXmlRpc((Map<String, Object>) complexQueryHash.get("queryFilter")));
-        }
-        return complexQuery;
-    }
-    public static Map<String, Object> getXmlRpcQueryFilter(QueryFilter queryFilter) {
-        Map<String, Object> queryFilterHash = new ConcurrentHashMap<String, Object>();
-        queryFilterHash.put("startDateTimeMetKey", queryFilter.getStartDateTimeMetKey());
-        queryFilterHash.put("endDateTimeMetKey", queryFilter.getEndDateTimeMetKey());
-        queryFilterHash.put("priorityMetKey", queryFilter.getPriorityMetKey());
-        queryFilterHash.put("filterAlgor", getXmlRpcFilterAlgor(queryFilter.getFilterAlgor()));
-        queryFilterHash.put("versionConverterClass", queryFilter.getConverter().getClass().getCanonicalName());
-        return queryFilterHash;
-    }
-    
-    public static QueryFilter getQueryFilterFromXmlRpc(Map<String, Object> queryFilterHash) {
-        String startDateTimeMetKey = (String) queryFilterHash.get("startDateTimeMetKey");
-        String endDateTimeMetKey = (String) queryFilterHash.get("endDateTimeMetKey");
-        String priorityMetKey = (String) queryFilterHash.get("priorityMetKey");
-        @SuppressWarnings("unchecked")
-        FilterAlgor filterAlgor = getFilterAlgorFromXmlRpc((Map<String, Object>) queryFilterHash.get("filterAlgor"));
-        QueryFilter queryFilter = new QueryFilter(startDateTimeMetKey, endDateTimeMetKey, priorityMetKey, filterAlgor);
-        queryFilter.setConverter(GenericFileManagerObjectFactory.getVersionConverterFromClassName((String) queryFilterHash.get("versionConverterClass")));
-        return queryFilter;
-    }
-
-    public static Map<String, Object> getXmlRpcFilterAlgor(FilterAlgor filterAlgor) {
-        Map<String, Object> filterAlgorHash = new ConcurrentHashMap<String, Object>();
-        filterAlgorHash.put("class", filterAlgor.getClass().getCanonicalName());
-        filterAlgorHash.put("epsilon", Long.toString(filterAlgor.getEpsilon()));
-        return filterAlgorHash;
-    }
-    
-    public static FilterAlgor getFilterAlgorFromXmlRpc(Map<String, Object> filterAlgorHash) {
-        FilterAlgor filterAlgor = GenericFileManagerObjectFactory.getFilterAlgorFromClassName((String) filterAlgorHash.get("class"));
-        if (filterAlgor != null) {
-            filterAlgor.setEpsilon(Long.parseLong((String) filterAlgorHash.get("epsilon")));
-        }
-        return filterAlgor;
+    if (product.getProductName() != null) {
+      productHash.put("name", product.getProductName());
     }
-    
-    public static Vector<Map<String, Object>> getXmlRpcQueryResults(List<QueryResult> queryResults) {
-        Vector<Map<String, Object>> queryResultHashVector = new Vector<Map<String, Object>>();
-        for (QueryResult queryResult : queryResults) {
-            queryResultHashVector.add(getXmlRpcQueryResult(queryResult));
-        }
-        return queryResultHashVector;
+    if (product.getProductType() != null) {
+      productHash.put("type", getXmlRpcProductType(product.getProductType()));
     }
-
-    public static Vector<Map<String, Object>> getXmlRpcQueryResultsMap(List<QueryResult> queryResults) {
-        Vector<Map<String, Object>> queryResultHashVector = new Vector<Map<String, Object>>();
-        for (QueryResult queryResult : queryResults) {
-            queryResultHashVector.add(getXmlRpcQueryResult(queryResult));
-        }
-        return queryResultHashVector;
+    if (product.getProductStructure() != null) {
+      productHash.put("structure", product.getProductStructure());
     }
-
-    public static List<QueryResult> getQueryResultsFromXmlRpc(Vector<Map<String, Object>> queryResultHashVector) {
-        List<QueryResult> queryResults = new Vector<QueryResult>();
-        for (Map<String, Object> queryResultHash : queryResultHashVector) {
-            queryResults.add(getQueryResultFromXmlRpc(queryResultHash));
-        }
-        return queryResults;
+    if (product.getTransferStatus() != null) {
+      productHash.put("transferStatus", product.getTransferStatus());
     }
-
-    public static List<QueryResult> getQueryResultsFromXmlRpcMap(Vector<Map<String, Object>>
-                                                                   queryResultHashVector) {
-        List<QueryResult> queryResults = new Vector<QueryResult>();
-        for (Map<String, Object> queryResultHash : queryResultHashVector) {
-            queryResults.add(getQueryResultFromXmlRpc(queryResultHash));
-        }
-        return queryResults;
+    if (product.getProductReferences() != null) {
+      productHash.put("references", getXmlRpcReferences(product
+          .getProductReferences()));
     }
-    public static Map<String, Object> getXmlRpcQueryResult(QueryResult queryResult) {
-        Hashtable<String, Object> queryResultHash = new Hashtable<String, Object>();
-        if (queryResult.getToStringFormat() != null) {
-            queryResultHash.put("toStringFormat", queryResult.getToStringFormat());
-        }
-        queryResultHash.put("product", getXmlRpcProduct(queryResult.getProduct()));
-        queryResultHash.put("metadata", queryResult.getMetadata().getHashTable());
-        return queryResultHash;
+    if (product.getRootRef() != null) {
+      productHash.put("rootReference", getXmlRpcReference(product
+          .getRootRef()));
     }
+    return productHash;
+  }
 
-    
-    @SuppressWarnings("unchecked")
-    public static QueryResult getQueryResultFromXmlRpc(Map<String, Object> queryResultHash) {
-        Product product = getProductFromXmlRpc((Map<String, Object>) queryResultHash.get("product"));
-        Metadata metadata = new Metadata();
-        metadata.addMetadata((Map<String, Object>) queryResultHash.get("metadata"));
-        QueryResult queryResult = new QueryResult(product, metadata);
-        queryResult.setToStringFormat((String) queryResultHash.get("toStringFormat"));
-        return queryResult;
-    }
-    
-    public static Map<String, Object> getXmlRpcProduct(Product product) {
-        Map<String, Object> productHash = new Hashtable<String, Object>();
-        if (product.getProductId() != null) {
-           productHash.put("id", product.getProductId());
-        }
-        if (product.getProductName() != null) {
-           productHash.put("name", product.getProductName());
-        }
-        if (product.getProductType() != null) {
-           productHash.put("type", getXmlRpcProductType(product.getProductType()));
-        }
-        if (product.getProductStructure() != null) {
-           productHash.put("structure", product.getProductStructure());
-        }
-        if (product.getTransferStatus() != null) {
-           productHash.put("transferStatus", product.getTransferStatus());
-        }
-        if (product.getProductReferences() != null) {
-           productHash.put("references", getXmlRpcReferences(product
-                .getProductReferences()));
-        }
-        if (product.getRootRef() != null) {
-           productHash.put("rootReference", getXmlRpcReference(product
-                 .getRootRef()));
-        }
-        return productHash;
+  @SuppressWarnings("unchecked")
+  public static Product getProductFromXmlRpc(Map<?, ?> productHash) {
+    Product product = new Product();
+    product.setProductId((String) productHash.get("id"));
+    product.setProductName((String) productHash.get("name"));
+    if (productHash.get("type") != null) {
+      product.setProductType(getProductTypeFromXmlRpc(
+          (Map<String, Object>) productHash.get("type")));
     }
-
-    @SuppressWarnings("unchecked")
-    public static Product getProductFromXmlRpc(Map<?, ?> productHash) {
-        Product product = new Product();
-        product.setProductId((String) productHash.get("id"));
-        product.setProductName((String) productHash.get("name"));
-        if (productHash.get("type") != null) {
-           product.setProductType(getProductTypeFromXmlRpc(
-                 (Map<String, Object>) productHash.get("type")));
-        }
-        product.setProductStructure((String) productHash.get("structure"));
-        product.setTransferStatus((String) productHash.get("transferStatus"));
-        if (productHash.get("references") != null) {
-           product.setProductReferences(getReferencesFromXmlRpc(
-                 (Vector<Map<String, Object>>) productHash
-                        .get("references")));
-        }
-        if (productHash.get("rootReference") != null) {
-           product.setRootRef(getReferenceFromXmlRpc(
-                 (Map<String, Object>) productHash.get("rootReference")));
-        }
-        return product;
+    product.setProductStructure((String) productHash.get("structure"));
+    product.setTransferStatus((String) productHash.get("transferStatus"));
+    if (productHash.get("references") != null) {
+      product.setProductReferences(getReferencesFromXmlRpc(
+          (Vector<Map<String, Object>>) productHash
+              .get("references")));
     }
-
-    public static List<Product> getProductListFromXmlRpc(Vector<Map<String, Object>> productVector) {
-        List<Product> productList = new Vector<Product>();
-
-        for (Map<String, Object> productHash : productVector) {
-            Product product = getProductFromXmlRpc(productHash);
-            productList.add(product);
-        }
-
-        return productList;
+    if (productHash.get("rootReference") != null) {
+      product.setRootRef(getReferenceFromXmlRpc(
+          (Map<String, Object>) productHash.get("rootReference")));
     }
+    return product;
+  }
 
-    public static Vector<Map<String, Object>> getXmlRpcProductListMap(List<Product> products) {
-        Vector<Map<String, Object>> productVector = new Vector<Map<String, Object>>();
+  public static List<Product> getProductListFromXmlRpc(Vector<Map<String, Object>> productVector) {
+    List<Product> productList = new Vector<Product>();
 
-        if (products == null) {
-            return productVector;
-        }
-
-        for (Product product : products) {
-            Map<String, Object> productHash = getXmlRpcProduct(product);
-            productVector.add(productHash);
-        }
-
-        return productVector;
+    for (Map<String, Object> productHash : productVector) {
+      Product product = getProductFromXmlRpc(productHash);
+      productList.add(product);
     }
 
-    public static Vector<Map<String, Object>> getXmlRpcProductList(List<Product> products) {
-        Vector<Map<String, Object>> productVector = new Vector<Map<String, Object>>();
+    return productList;
+  }
 
-        if (products == null) {
-            return productVector;
-        }
 
-        for (Product product : products) {
-            Map<String, Object> productHash = getXmlRpcProduct(product);
-            productVector.add(productHash);
-        }
+  public static Vector<Map<String, Object>> getXmlRpcProductList(List<Product> products) {
+    Vector<Map<String, Object>> productVector = new Vector<Map<String, Object>>();
 
-        return productVector;
+    if (products == null) {
+      return productVector;
     }
 
-    public static Vector<Map<String, Object>> getXmlRpcProductTypeList(List<ProductType> productTypes) {
-        Vector<Map<String, Object>> productTypeVector = new Vector<Map<String, Object>>();
-
-        if (productTypes == null) {
-            return productTypeVector;
-        }
-
-        for (ProductType type : productTypes) {
-            Map<String, Object> typeHash = getXmlRpcProductType(type);
-            productTypeVector.add(typeHash);
-        }
-        return productTypeVector;
+    for (Product product : products) {
+      Map<String, Object> productHash = getXmlRpcProduct(product);
+      productVector.add(productHash);
     }
 
-    public static List<ProductType> getProductTypeListFromXmlRpc(Vector<Map<String, Object>> productTypeVector) {
-        List<ProductType> productTypeList = new Vector<ProductType>();
-        for (Map<String, Object> productTypeHash : productTypeVector) {
-            ProductType type = getProductTypeFromXmlRpc(productTypeHash);
-            productTypeList.add(type);
-        }
+    return productVector;
+  }
 
-        return productTypeList;
-    }
+  public static Vector<Map<String, Object>> getXmlRpcProductTypeList(List<ProductType> productTypes) {
+    Vector<Map<String, Object>> productTypeVector = new Vector<Map<String, Object>>();
 
-    public static Map<String, Object> getXmlRpcProductType(ProductType type) {
-        Map<String, Object> productTypeHash = new Hashtable<String, Object>();
-        // TODO(bfoster): ProductType ID is currently required by XmlRpcFileManager.
-        productTypeHash.put("id", type.getProductTypeId());
-        if (type.getName() != null) {
-            productTypeHash.put("name", type.getName());
-        }
-        if (type.getDescription() != null) {
-            productTypeHash.put("description", type.getDescription());
-        }
-        if (type.getProductRepositoryPath() != null) {
-            productTypeHash.put("repositoryPath",type.getProductRepositoryPath());
-        }
-        if (type.getVersioner() != null) {
-            productTypeHash.put("versionerClass", type.getVersioner());
-        }
-        if (type.getTypeMetadata() != null) {
-            productTypeHash.put("typeMetadata", type.getTypeMetadata().getHashTable());
-        }
-        if (type.getExtractors() != null) {
-            productTypeHash.put("typeExtractors", getXmlRpcTypeExtractors(type.getExtractors()));
-        }
-        if (type.getHandlers() != null) {
-            productTypeHash.put("typeHandlers", getXmlRpcTypeHandlers(type.getHandlers()));
-        }
-        return productTypeHash;
+    if (productTypes == null) {
+      return productTypeVector;
     }
 
-    @SuppressWarnings("unchecked")
-    public static ProductType getProductTypeFromXmlRpc(Map<String, Object> productTypeHash) {
-        ProductType type = new ProductType();
-        type.setDescription((String) productTypeHash.get("description"));
-        type.setName((String) productTypeHash.get("name"));
-        type.setProductRepositoryPath((String) productTypeHash.get("repositoryPath"));
-        type.setProductTypeId((String) productTypeHash.get("id"));
-        type.setVersioner((String) productTypeHash.get("versionerClass"));
-        if (productTypeHash.get("typeMetadata") != null) {
-           Metadata typeMet = new Metadata();
-           typeMet.addMetadata((Map<String, Object>) productTypeHash.get("typeMetadata"));
-           type.setTypeMetadata(typeMet);
-        }
-        if (productTypeHash.get("typeExtractors") != null) {
-            type.setExtractors(getTypeExtractorsFromXmlRpc(
-                  (Vector<Map<String, Object>>) productTypeHash
-                     .get("typeExtractors")));
-        }
-        if (productTypeHash.get("typeHandlers") != null) {
-            type.setHandlers(getTypeHandlersFromXmlRpc(
-                  (Vector<Map<String, Object>>) productTypeHash
-                        .get("typeHandlers")));
-        }
-        return type;
-    }
-
-    public static Vector<Map<String, Object>> getXmlRpcTypeExtractors(List<ExtractorSpec> extractors) {
-        Vector<Map<String, Object>> extractorsVector = new Vector<Map<String, Object>>();
-
-        if (extractors != null && extractors.size() > 0) {
-            for (ExtractorSpec spec : extractors) {
-                extractorsVector.add(getXmlRpcExtractorSpec(spec));
-            }
-        }
-
-        return extractorsVector;
-    }
-    public static Vector<Map<String, Object>> getXmlRpcTypeExtractorsMap(List<ExtractorSpec> extractors) {
-        Vector<Map<String, Object>> extractorsVector = new Vector<Map<String, Object>>();
-
-        if (extractors != null && extractors.size() > 0) {
-            for (ExtractorSpec spec : extractors) {
-                extractorsVector.add(getXmlRpcExtractorSpec(spec));
-            }
-        }
-
-        return extractorsVector;
+    for (ProductType type : productTypes) {
+      Map<String, Object> typeHash = getXmlRpcProductType(type);
+      productTypeVector.add(typeHash);
     }
+    return productTypeVector;
+  }
 
-    public static Map<String, Object> getXmlRpcExtractorSpec(ExtractorSpec spec) {
-        Map<String, Object> extractorHash = new Hashtable<String, Object>();
-        extractorHash.put("className", spec.getClassName());
-        extractorHash.put("config",
-                getXmlRpcProperties(spec.getConfiguration()));
-        return extractorHash;
+  public static List<ProductType> getProductTypeListFromXmlRpc(Vector<Map<String, Object>> productTypeVector) {
+    List<ProductType> productTypeList = new Vector<ProductType>();
+    for (Map<String, Object> productTypeHash : productTypeVector) {
+      ProductType type = getProductTypeFromXmlRpc(productTypeHash);
+      productTypeList.add(type);
     }
 
-    public static Vector<Map<String, Object>> getXmlRpcTypeHandlers(List<TypeHandler> typeHandlers) {
-        Vector<Map<String, Object>> handlersVector = new Vector<Map<String, Object>>();
+    return productTypeList;
+  }
 
-        if (typeHandlers != null && typeHandlers.size() > 0) {
-            for (TypeHandler typeHandler : typeHandlers) {
-                handlersVector.add(getXmlRpcTypeHandler(typeHandler));
-            }
-        }
-
-        return handlersVector;
+  public static Map<String, Object> getXmlRpcProductType(ProductType type) {
+    Map<String, Object> productTypeHash = new Hashtable<String, Object>();
+    // TODO(bfoster): ProductType ID is currently required by XmlRpcFileManager.
+    productTypeHash.put("id", type.getProductTypeId());
+    if (type.getName() != null) {
+      productTypeHash.put("name", type.getName());
     }
-
-    public static Map<String, Object> getXmlRpcTypeHandler(TypeHandler typeHandler) {
-        Map<String, Object> handlerHash = new Hashtable<String, Object>();
-        handlerHash.put("className", typeHandler != null ?
-                                     typeHandler.getClass().getCanonicalName():"");
-        handlerHash.put("elementName", typeHandler != null ?
-                                       typeHandler.getElementName():"");
-        return handlerHash;
+    if (type.getDescription() != null) {
+      productTypeHash.put("description", type.getDescription());
     }
-
-    public static List<ExtractorSpec> getTypeExtractorsFromXmlRpc(Vector<Map<String, Object>> extractorsVector) {
-        List<ExtractorSpec> extractors = new Vector<ExtractorSpec>();
-
-        if (extractorsVector != null && extractorsVector.size() > 0) {
-            for (Map<String, Object> extractorSpecHash : extractorsVector) {
-                extractors.add(getExtractorSpecFromXmlRpc(extractorSpecHash));
-            }
-        }
-
-        return extractors;
+    if (type.getProductRepositoryPath() != null) {
+      productTypeHash.put("repositoryPath", type.getProductRepositoryPath());
     }
-
-    @SuppressWarnings("unchecked")
-    public static ExtractorSpec getExtractorSpecFromXmlRpc(
-            Map<String, Object> extractorSpecHash) {
-        ExtractorSpec spec = new ExtractorSpec();
-        spec.setClassName((String) extractorSpecHash.get("className"));
-        spec
-                .setConfiguration(getPropertiesFromXmlRpc((Map<String, String>) extractorSpecHash
-                        .get("config")));
-        return spec;
-    }
-    
-    public static List<TypeHandler> getTypeHandlersFromXmlRpc(Vector<Map<String, Object>> handlersVector) {
-        List<TypeHandler> handlers = new Vector<TypeHandler>();
-
-        if (handlersVector != null && handlersVector.size() > 0) {
-            for (Map<String, Object> typeHandlerHash : handlersVector) {
-                handlers.add(getTypeHandlerFromXmlRpc(typeHandlerHash));
-            }
-        }
-
-        return handlers;
-    }
-    
-    public static TypeHandler getTypeHandlerFromXmlRpc(
-            Map<String, Object> typeHandlerHash) {
-        TypeHandler typeHandler = GenericFileManagerObjectFactory
-            .getTypeHandlerFromClassName((String) typeHandlerHash.get("className"));
-        if(typeHandler != null) {
-            typeHandler.setElementName((String) typeHandlerHash.get("elementName"));
-        }
-        return typeHandler;
+    if (type.getVersioner() != null) {
+      productTypeHash.put("versionerClass", type.getVersioner());
     }
-
-    public static Properties getPropertiesFromXmlRpc(Map<String, String> propHash) {
-        Properties props = new Properties();
-
-        if (propHash != null && propHash.keySet().size() > 0) {
-            for (Map.Entry<String, String> propName : propHash.entrySet()) {
-                String propValue = propName.getValue();
-                props.setProperty(propName.getKey(), propValue);
-            }
-        }
-
-        return props;
+    if (type.getTypeMetadata() != null) {
+      productTypeHash.put("typeMetadata", type.getTypeMetadata().getHashTable());
     }
-
-    public static Map<String, String> getXmlRpcProperties(Properties props) {
-        Map<String, String> propHash = new Hashtable<String, String>();
-
-        if (props != null && props.keySet().size() > 0) {
-            for (Object o : props.keySet()) {
-                String propName = (String) o;
-                String propValue = props.getProperty(propName);
-                propHash.put(propName, propValue);
-            }
-        }
-
-        return propHash;
+    if (type.getExtractors() != null) {
+      productTypeHash.put("typeExtractors", getXmlRpcTypeExtractors(type.getExtractors()));
     }
-
-    public static Vector<Map<String, Object>> getXmlRpcReferencesMap(List<Reference> references) {
-        Vector<Map<String, Object>> refVector = new Vector<Map<String, Object>>();
-
-        if (references == null) {
-            return refVector;
-        }
-
-        for (Reference reference : references) {
-            Map<String, Object> refHash = getXmlRpcReference(reference);
-            refVector.add(refHash);
-        }
-
-        return refVector;
+    if (type.getHandlers() != null) {
+      productTypeHash.put("typeHandlers", getXmlRpcTypeHandlers(type.getHandlers()));
     }
+    return productTypeHash;
+  }
 
-    public static Vector<Map<String, Object>> getXmlRpcReferences(List<Reference> references) {
-        Vector<Map<String, Object>> refVector = new Vector<Map<String, Object>>();
-
-        if (references == null) {
-            return refVector;
-        }
-
-        for (Reference reference : references) {
-            Map<String, Object> refHash = getXmlRpcReference(reference);
-            refVector.add(refHash);
-        }
-
-        return refVector;
-    }
-    public static List<Reference> getReferencesFromXmlRpc(Vector<Map<String, Object>> referenceVector) {
-        List<Reference> references = new Vector<Reference>();
-        for (Map<String, Object> aReferenceVector : referenceVector) {
-            Reference r = getReferenceFromXmlRpc(aReferenceVector);
-            references.add(r);
-        }
-        return references;
-    }
-
-    public static Map<String, Object> getXmlRpcReference(Reference reference) {
-        Map<String, Object> referenceHash = new Hashtable<String, Object>();
-        referenceHash.put("origReference", reference.getOrigReference());
-        referenceHash.put("dataStoreReference", reference
-                .getDataStoreReference() != null ? reference
-                .getDataStoreReference() : "");
-        referenceHash.put("fileSize",
-                Long.toString(reference.getFileSize()));
-        referenceHash.put("mimeType", (reference.getMimeType() == null) ? ""
-                : reference.getMimeType().getName());
-        return referenceHash;
-    }
-
-    public static Reference getReferenceFromXmlRpc(Map<String, Object> referenceHash) {
-        Reference reference = new Reference();
-        reference.setDataStoreReference((String) referenceHash
-                .get("dataStoreReference"));
-        reference.setOrigReference((String) referenceHash.get("origReference"));
-        reference.setFileSize(Long.parseLong(referenceHash.get("fileSize").toString()));
-        reference.setMimeType((String) referenceHash.get("mimeType"));
-        return reference;
-    }
-
-    public static Reference getReferenceFromXmlRpcHashtable(Map<String, Object> referenceHash) {
-        Reference reference = new Reference();
-        reference.setDataStoreReference((String) referenceHash
-            .get("dataStoreReference"));
-        reference.setOrigReference((String) referenceHash.get("origReference"));
-        reference.setFileSize(Long.parseLong(referenceHash.get("fileSize").toString()));
-        reference.setMimeType((String) referenceHash.get("mimeType"));
-        return reference;
-    }
-
-    public static Vector<Map<String, Object>> getXmlRpcElementListHashtable(List<Element> elementList) {
-        Vector<Map<String, Object>> elementVector = new Vector<Map<String, Object>>(elementList.size());
-        for (Element element : elementList) {
-            Map<String, Object> elementHash = getXmlRpcElementHashTable(element);
-            elementVector.add(elementHash);
-        }
-        return elementVector;
+  @SuppressWarnings("unchecked")
+  public static ProductType getProductTypeFromXmlRpc(Map<String, Object> productTypeHash) {
+    ProductType type = new ProductType();
+    type.setDescription((String) productTypeHash.get("description"));
+    type.setName((String) productTypeHash.get("name"));
+    type.setProductRepositoryPath((String) productTypeHash.get("repositoryPath"));
+    type.setProductTypeId((String) productTypeHash.get("id"));
+    type.setVersioner((String) productTypeHash.get("versionerClass"));
+    if (productTypeHash.get("typeMetadata") != null) {
+      Metadata typeMet = new Metadata();
+      typeMet.addMetadata((Map<String, Object>) productTypeHash.get("typeMetadata"));
+      type.setTypeMetadata(typeMet);
     }
-
-    public static Vector<Map<String, Object>> getXmlRpcElementList(List<Element> elementList) {
-        Vector<Map<String, Object>> elementVector = new Vector<Map<String, Object>>(elementList.size());
-        for (Element element : elementList) {
-            Map<String, Object> elementHash = getXmlRpcElement(element);
-            elementVector.add(elementHash);
-        }
-        return elementVector;
+    if (productTypeHash.get("typeExtractors") != null) {
+      type.setExtractors(getTypeExtractorsFromXmlRpc(
+          (Vector<Map<String, Object>>) productTypeHash
+              .get("typeExtractors")));
     }
-
-    public static List<Element> getElementListFromXmlRpc(Vector<Map<String, Object>> elementVector) {
-        List<Element> elementList = new Vector<Element>(elementVector.size());
-        for (Map<String, Object> elementHash : elementVector) {
-            Element element = getElementFromXmlRpc(elementHash);
-            elementList.add(element);
-        }
-        return elementList;
+    if (productTypeHash.get("typeHandlers") != null) {
+      type.setHandlers(getTypeHandlersFromXmlRpc(
+          (Vector<Map<String, Object>>) productTypeHash
+              .get("typeHandlers")));
     }
+    return type;
+  }
 
-    public static Map<String, Object> getXmlRpcElement(Element element) {
-        Map<String, Object> elementHash = new HashMap<String, Object>();
+  public static Vector<Map<String, Object>> getXmlRpcTypeExtractors(List<ExtractorSpec> extractors) {
+    Vector<Map<String, Object>> extractorsVector = new Vector<Map<String, Object>>();
 
-        elementHash.put("id", element.getElementId());
-        elementHash.put("name", element.getElementName());
-        elementHash.put("dcElement", element.getDCElement() != null ? element
-                .getDCElement() : "");
-        elementHash.put("description",
-                element.getDescription() != null ? element.getDescription()
-                        : "");
-
-        return elementHash;
+    if (extractors != null && extractors.size() > 0) {
+      for (ExtractorSpec spec : extractors) {
+        extractorsVector.add(getXmlRpcExtractorSpec(spec));
+      }
     }
-    public static Map<String, Object> getXmlRpcElementHashTable(Element element) {
-        Map<String, Object> elementHash = new Hashtable<String, Object>();
 
-        elementHash.put("id", element.getElementId());
-        elementHash.put("name", element.getElementName());
-        elementHash.put("dcElement", element.getDCElement() != null ? element
-            .getDCElement() : "");
-        elementHash.put("description",
-            element.getDescription() != null ? element.getDescription()
-                                             : "");
+    return extractorsVector;
+  }
 
-        return elementHash;
-    }
-    public static Element getElementFromXmlRpc(Map<String, Object> elementHash) {
-        Element element = new Element();
-        element.setElementId((String) elementHash.get("id"));
-        element.setElementName((String) elementHash.get("name"));
-        element.setDescription((String) elementHash.get("description"));
-        element.setDCElement((String) elementHash.get("dcElement"));
+  public static Map<String, Object> getXmlRpcExtractorSpec(ExtractorSpec spec) {
+    Map<String, Object> extractorHash = new Hashtable<String, Object>();
+    extractorHash.put("className", spec.getClassName());
+    extractorHash.put("config",
+        getXmlRpcProperties(spec.getConfiguration()));
+    return extractorHash;
+  }
 
-        return element;
-    }
+  public static Vector<Map<String, Object>> getXmlRpcTypeHandlers(List<TypeHandler> typeHandlers) {
+    Vector<Map<String, Object>> handlersVector = new Vector<Map<String, Object>>();
 
-    public static Map<String, Object> getXmlRpcQuery(Query query) {
-        Map<String, Object> queryHash = new Hashtable<String, Object>();
-        Vector<Map<String, Object>> criteriaVector = getXmlRpcQueryCriteriaList(query.getCriteria());
-        queryHash.put("criteria", criteriaVector);
-        return queryHash;
+    if (typeHandlers != null && typeHandlers.size() > 0) {
+      for (TypeHandler typeHandler : typeHandlers) {
+        handlersVector.add(getXmlRpcTypeHandler(typeHandler));
+      }
     }
 
-    public static Query getQueryFromXmlRpc(Map<String, Object> queryHash) {
-        Query query = new Query();
-        @SuppressWarnings("unchecked")
-        List<QueryCriteria> criteria = getQueryCriteriaListFromXmlRpc((Vector<Map<String, Object>>) queryHash
-                .get("criteria"));
-        query.setCriteria(criteria);
-        return query;
-    }
+    return handlersVector;
+  }
 
-    public static Query getQueryFromXmlRpcMap(Map<String, Object> queryHash) {
-        Query query = new Query();
-        @SuppressWarnings("unchecked")
-        List<QueryCriteria> criteria = getQueryCriteriaListFromXmlRpc((Vector<Map<String, Object>>) queryHash
-            .get("criteria"));
-        query.setCriteria(criteria);
-        return query;
-    }
+  public static Map<String, Object> getXmlRpcTypeHandler(TypeHandler typeHandler) {
+    Map<String, Object> handlerHash = new Hashtable<String, Object>();
+    handlerHash.put("className", typeHandler != null ?
+                                 typeHandler.getClass().getCanonicalName() : "");
+    handlerHash.put("elementName", typeHandler != null ?
+                                   typeHandler.getElementName() : "");
+    return handlerHash;
+  }
 
-    public static Vector<Map<String, Object>> getXmlRpcQueryCriteriaList(List<QueryCriteria> criteriaList) {
-        Vector<Map<String, Object>> criteriaVector = new Vector<Map<String, Object>>(criteriaList.size());
-        for (QueryCriteria criteria : criteriaList) {
-            Map<String, Object> criteriaHash = getXmlRpcQueryCriteria(criteria);
-            criteriaVector.add(criteriaHash);
-        }
+  public static List<ExtractorSpec> getTypeExtractorsFromXmlRpc(Vector<Map<String, Object>> extractorsVector) {
+    List<ExtractorSpec> extractors = new Vector<ExtractorSpec>();
 
-        return criteriaVector;
+    if (extractorsVector != null && extractorsVector.size() > 0) {
+      for (Map<String, Object> extractorSpecHash : extractorsVector) {
+        extractors.add(getExtractorSpecFromXmlRpc(extractorSpecHash));
+      }
     }
 
-    public static List<QueryCriteria> getQueryCriteriaListFromXmlRpc(Vector<Map<String, Object>> criteriaVector) {
-
-        List<QueryCriteria> criteriaList = new Vector<QueryCriteria>(criteriaVector.size());
-        for (Map<String, Object> criteriaHash : criteriaVector) {
-            QueryCriteria criteria = getQueryCriteriaFromXmlRpc(criteriaHash);
-            criteriaList.add(criteria);
-        }
-        return criteriaList;
-    }
-
-    public static Map<String, Object> getXmlRpcQueryCriteria(QueryCriteria criteria) {
-        Map<String, Object> criteriaHash = new Hashtable<String, Object>();
-        criteriaHash.put("class",criteria.getClass().getCanonicalName());
-        
-        if(criteria instanceof TermQueryCriteria){  
-            criteriaHash.put("elementName", criteria.getElementName());
-            criteriaHash.put("elementValue", ((TermQueryCriteria)criteria).getValue());
-        } else if(criteria instanceof RangeQueryCriteria){
-            criteriaHash.put("elementName", criteria.getElementName());
-            criteriaHash.put("elementStartValue", ((RangeQueryCriteria)criteria).getStartValue() != null ?
-                    ((RangeQueryCriteria)criteria).getStartValue():"");
-            criteriaHash.put("elementEndValue", ((RangeQueryCriteria)criteria).getEndValue() != null ?
-                    ((RangeQueryCriteria)criteria).getEndValue():"");
-            criteriaHash.put("inclusive", Boolean.toString(((RangeQueryCriteria) criteria).getInclusive())); 
-        } else if(criteria instanceof BooleanQueryCriteria){
-            BooleanQueryCriteria boolQuery = (BooleanQueryCriteria) criteria;
-            criteriaHash.put("operator", boolQuery.getOperator());
-            Vector<Map<String, Object>> termsHash = new Vector<Map<String, Object>>();
-            List<QueryCriteria> terms = boolQuery.getTerms();
-
-            for (QueryCriteria term : terms) {
-                Map<String, Object> termHash = getXmlRpcQueryCriteria(term);
-                termsHash.add(termHash);
-            }
-            criteriaHash.put("terms", termsHash);
-            
-        } else {
-            //should not happen
-        }
-        return criteriaHash;
-    }
-    
-    public static QueryCriteria getQueryCriteriaFromXmlRpc(Map<String, Object> criteriaHash) {
-        QueryCriteria criteria = null;
-        if(criteriaHash.get("class").equals(TermQueryCriteria.class.getCanonicalName())){
-            criteria = new TermQueryCriteria();
-            criteria.setElementName((String) criteriaHash.get("elementName"));
-            ((TermQueryCriteria)criteria).setValue((String) criteriaHash.get("elementValue"));
-        } else if(criteriaHash.get("class").equals(RangeQueryCriteria.class.getCanonicalName())){
-            criteria = new RangeQueryCriteria();
-            criteria.setElementName((String) criteriaHash.get("elementName"));
-            String startVal = criteriaHash.get("elementStartValue").equals("") ? 
-                    null : (String)criteriaHash.get("elementStartValue");
-            String endVal = criteriaHash.get("elementEndValue").equals("") ?
-                    null : (String)criteriaHash.get("elementEndValue");
-            ((RangeQueryCriteria)criteria).setStartValue(startVal);
-            ((RangeQueryCriteria)criteria).setEndValue(endVal);
-            ((RangeQueryCriteria)criteria).setInclusive(Boolean.parseBoolean((String) criteriaHash.get("inclusive")));
-        } else if(criteriaHash.get("class").equals(BooleanQueryCriteria.class.getCanonicalName())){
-            criteria = new BooleanQueryCriteria();
-            try{
-              ((BooleanQueryCriteria)criteria).setOperator((Integer) criteriaHash.get("operator"));
-            } catch (QueryFormulationException e){
-                System.out.println("Error generating Boolean Query.");
-            }
-            @SuppressWarnings("unchecked")
-            List<Map<String, Object>> terms = (List<Map<String, Object>>) criteriaHash.get("terms");
-            for (Map<String, Object> term : terms) {
-                QueryCriteria termCriteria = getQueryCriteriaFromXmlRpc(term);
-                try {
-                    ((BooleanQueryCriteria) criteria).addTerm(termCriteria);
-                } catch (QueryFormulationException e) {
-                    System.out.println("Error generating Boolean Query.");
-                }
-            }
-            
-        }
+    return extractors;
+  }
 
-        return criteria;        
-        
-    }
+  @SuppressWarnings("unchecked")
+  public static ExtractorSpec getExtractorSpecFromXmlRpc(
+      Map<String, Object> extractorSpecHash) {
+    ExtractorSpec spec = new ExtractorSpec();
+    spec.setClassName((String) extractorSpecHash.get("className"));
+    spec
+        .setConfiguration(getPropertiesFromXmlRpc((Map<String, String>) extractorSpecHash
+            .get("config")));
+    return spec;
+  }
+
+  public static List<TypeHandler> getTypeHandlersFromXmlRpc(Vector<Map<String, Object>> handlersVector) {
+    List<TypeHandler> handlers = new Vector<TypeHandler>();
+
+    if (handlersVector != null && handlersVector.size() > 0) {
+      for (Map<String, Object> typeHandlerHash : handlersVector) {
+        handlers.add(getTypeHandlerFromXmlRpc(typeHandlerHash));
+      }
+    }
+
+    return handlers;
+  }
+
+  public static TypeHandler getTypeHandlerFromXmlRpc(
+      Map<String, Object> typeHandlerHash) {
+    TypeHandler typeHandler = GenericFileManagerObjectFactory
+        .getTypeHandlerFromClassName((String) typeHandlerHash.get("className"));
+    if (typeHandler != null) {
+      typeHandler.setElementName((String) typeHandlerHash.get("elementName"));
+    }
+    return typeHandler;
+  }
+
+  public static Properties getPropertiesFromXmlRpc(Map<String, String> propHash) {
+    Properties props = new Properties();
+
+    if (propHash != null && propHash.keySet().size() > 0) {
+      for (Map.Entry<String, String> propName : propHash.entrySet()) {
+        String propValue = propName.getValue();
+        props.setProperty(propName.getKey(), propValue);
+      }
+    }
+
+    return props;
+  }
+
+  public static Map<String, String> getXmlRpcProperties(Properties props) {
+    Map<String, String> propHash = new Hashtable<String, String>();
+
+    if (props != null && props.keySet().size() > 0) {
+      for (Object o : props.keySet()) {
+        String propName = (String) o;
+        String propValue = props.getProperty(propName);
+        propHash.put(propName, propValue);
+      }
+    }
+
+    return propHash;
+  }
+
+
+  public static Vector<Map<String, Object>> getXmlRpcReferences(List<Reference> references) {
+    Vector<Map<String, Object>> refVector = new Vector<Map<String, Object>>();
+
+    if (references == null) {
+      return refVector;
+    }
+
+    for (Reference reference : references) {
+      Map<String, Object> refHash = getXmlRpcReference(reference);
+      refVector.add(refHash);
+    }
+
+    return refVector;
+  }
+
+  public static List<Reference> getReferencesFromXmlRpc(Vector<Map<String, Object>> referenceVector) {
+    List<Reference> references = new Vector<Reference>();
+    for (Map<String, Object> aReferenceVector : referenceVector) {
+      Reference r = getReferenceFromXmlRpc(aReferenceVector);
+      references.add(r);
+    }
+    return references;
+  }
+
+  public static Map<String, Object> getXmlRpcReference(Reference reference) {
+    Map<String, Object> referenceHash = new Hashtable<String, Object>();
+    referenceHash.put("origReference", reference.getOrigReference());
+    referenceHash.put("dataStoreReference", reference
+                                                .getDataStoreReference() != null ? reference
+                                                .getDataStoreReference() : "");
+    referenceHash.put("fileSize",
+        Long.toString(reference.getFileSize()));
+    referenceHash.put("mimeType", (reference.getMimeType() == null) ? ""
+                                                                    : reference.getMimeType().getName());
+    return referenceHash;
+  }
+
+  public static Reference getReferenceFromXmlRpc(Map<String, Object> referenceHash) {
+    Reference reference = new Reference();
+    reference.setDataStoreReference((String) referenceHash
+        .get("dataStoreReference"));
+    reference.setOrigReference((String) referenceHash.get("origReference"));
+    reference.setFileSize(Long.parseLong(referenceHash.get("fileSize").toString()));
+    reference.setMimeType((String) referenceHash.get("mimeType"));
+    return reference;
+  }
+
+  public static Reference getReferenceFromXmlRpcHashtable(Map<String, Object> referenceHash) {
+    Reference reference = new Reference();
+    reference.setDataStoreReference((String) referenceHash
+        .get("dataStoreReference"));
+    reference.setOrigReference((String) referenceHash.get("origReference"));
+    reference.setFileSize(Long.parseLong(referenceHash.get("fileSize").toString()));
+    reference.setMimeType((String) referenceHash.get("mimeType"));
+    return reference;
+  }
+
+  public static Vector<Map<String, Object>> getXmlRpcElementListHashtable(List<Element> elementList) {
+    Vector<Map<String, Object>> elementVector = new Vector<Map<String, Object>>(elementList.size());
+    for (Element element : elementList) {
+      Map<String, Object> elementHash = getXmlRpcElementHashTable(element);
+      elementVector.add(elementHash);
+    }
+    return elementVector;
+  }
+
+  public static Vector<Map<String, Object>> getXmlRpcElementList(List<Element> elementList) {
+    Vector<Map<String, Object>> elementVector = new Vector<Map<String, Object>>(elementList.size());
+    for (Element element : elementList) {
+      Map<String, Object> elementHash = getXmlRpcElement(element);
+      elementVector.add(elementHash);
+    }
+    return elementVector;
+  }
+
+  public static List<Element> getElementListFromXmlRpc(Vector<Map<String, Object>> elementVector) {
+    List<Element> elementList = new Vector<Element>(elementVector.size());
+    for (Map<String, Object> elementHash : elementVector) {
+      Element element = getElementFromXmlRpc(elementHash);
+      elementList.add(element);
+    }
+    return elementList;
+  }
+
+  public static Map<String, Object> getXmlRpcElement(Element element) {
+    Map<String, Object> elementHash = new HashMap<String, Object>();
+
+    elementHash.put("id", element.getElementId());
+    elementHash.put("name", element.getElementName());
+    elementHash.put("dcElement", element.getDCElement() != null ? element
+        .getDCElement() : "");
+    elementHash.put("description",
+        element.getDescription() != null ? element.getDescription()
+                                         : "");
+
+    return elementHash;
+  }
+
+  public static Map<String, Object> getXmlRpcElementHashTable(Element element) {
+    Map<String, Object> elementHash = new Hashtable<String, Object>();
+
+    elementHash.put("id", element.getElementId());
+    elementHash.put("name", element.getElementName());
+    elementHash.put("dcElement", element.getDCElement() != null ? element
+        .getDCElement() : "");
+    elementHash.put("description",
+        element.getDescription() != null ? element.getDescription()
+                                         : "");
+
+    return elementHash;
+  }
+
+  public static Element getElementFromXmlRpc(Map<String, Object> elementHash) {
+    Element element = new Element();
+    element.setElementId((String) elementHash.get("id"));
+    element.setElementName((String) elementHash.get("name"));
+    element.setDescription((String) elementHash.get("description"));
+    element.setDCElement((String) elementHash.get("dcElement"));
+
+    return element;
+  }
+
+  public static Map<String, Object> getXmlRpcQuery(Query query) {
+    Map<String, Object> queryHash = new Hashtable<String, Object>();
+    Vector<Map<String, Object>> criteriaVector = getXmlRpcQueryCriteriaList(query.getCriteria());
+    queryHash.put("criteria", criteriaVector);
+    return queryHash;
+  }
+
+  public static Query getQueryFromXmlRpc(Map<String, Object> queryHash) {
+    Query query = new Query();
+    @SuppressWarnings("unchecked")
+    List<QueryCriteria> criteria = getQueryCriteriaListFromXmlRpc((Vector<Map<String, Object>>) queryHash
+        .get("criteria"));
+    query.setCriteria(criteria);
+    return query;
+  }
+
+  public static Vector<Map<String, Object>> getXmlRpcQueryCriteriaList(List<QueryCriteria> criteriaList) {
+    Vector<Map<String, Object>> criteriaVector = new Vector<Map<String, Object>>(criteriaList.size());
+    for (QueryCriteria criteria : criteriaList) {
+      Map<String, Object> criteriaHash = getXmlRpcQueryCriteria(criteria);
+      criteriaVector.add(criteriaHash);
+    }
+
+    return criteriaVector;
+  }
+
+  public static List<QueryCriteria> getQueryCriteriaListFromXmlRpc(Vector<Map<String, Object>> criteriaVector) {
+
+    List<QueryCriteria> criteriaList = new Vector<QueryCriteria>(criteriaVector.size());
+    for (Map<String, Object> criteriaHash : criteriaVector) {
+      QueryCriteria criteria = getQueryCriteriaFromXmlRpc(criteriaHash);
+      criteriaList.add(criteria);
+    }
+    return criteriaList;
+  }
+
+  public static Map<String, Object> getXmlRpcQueryCriteria(QueryCriteria criteria) {
+    Map<String, Object> criteriaHash = new Hashtable<String, Object>();
+    criteriaHash.put("class", criteria.getClass().getCanonicalName());
+
+    if (criteria instanceof TermQueryCriteria) {
+      criteriaHash.put("elementName", criteria.getElementName());
+      criteriaHash.put("elementValue", ((TermQueryCriteria) criteria).getValue());
+    } else if (criteria instanceof RangeQueryCriteria) {
+      criteriaHash.put("elementName", criteria.getElementName());
+      criteriaHash.put("elementStartValue", ((RangeQueryCriteria) criteria).getStartValue() != null ?
+                                            ((RangeQueryCriteria) criteria).getStartValue() : "");
+      criteriaHash.put("elementEndValue", ((RangeQueryCriteria) criteria).getEndValue() != null ?
+                                          ((RangeQueryCriteria) criteria).getEndValue() : "");
+      criteriaHash.put("inclusive", Boolean.toString(((RangeQueryCriteria) criteria).getInclusive()));
+    } else if (criteria instanceof BooleanQueryCriteria) {
+      BooleanQueryCriteria boolQuery = (BooleanQueryCriteria) criteria;
+      criteriaHash.put("operator", boolQuery.getOperator());
+      Vector<Map<String, Object>> termsHash = new Vector<Map<String, Object>>();
+      List<QueryCriteria> terms = boolQuery.getTerms();
+
+      for (QueryCriteria term : terms) {
+        Map<String, Object> termHash = getXmlRpcQueryCriteria(term);
+        termsHash.add(termHash);
+      }
+      criteriaHash.put("terms", termsHash);
+
+    } else {
+      //should not happen
+    }
+    return criteriaHash;
+  }
+
+  public static QueryCriteria getQueryCriteriaFromXmlRpc(Map<String, Object> criteriaHash) {
+    QueryCriteria criteria = null;
+    if (criteriaHash.get("class").equals(TermQueryCriteria.class.getCanonicalName())) {
+      criteria = new TermQueryCriteria();
+      criteria.setElementName((String) criteriaHash.get("elementName"));
+      ((TermQueryCriteria) criteria).setValue((String) criteriaHash.get("elementValue"));
+    } else if (criteriaHash.get("class").equals(RangeQueryCriteria.class.getCanonicalName())) {
+      criteria = new RangeQueryCriteria();
+      criteria.setElementName((String) criteriaHash.get("elementName"));
+      String startVal = criteriaHash.get("elementStartValue").equals("") ?
+                        null : (String) criteriaHash.get("elementStartValue");
+      String endVal = criteriaHash.get("elementEndValue").equals("") ?
+                      null : (String) criteriaHash.get("elementEndValue");
+      ((RangeQueryCriteria) criteria).setStartValue(startVal);
+      ((RangeQueryCriteria) criteria).setEndValue(endVal);
+      ((RangeQueryCriteria) criteria).setInclusive(Boolean.parseBoolean((String) criteriaHash.get("inclusive")));
+    } else if (criteriaHash.get("class").equals(BooleanQueryCriteria.class.getCanonicalName())) {
+      criteria = new BooleanQueryCriteria();
+      try {
+        ((BooleanQueryCriteria) criteria).setOperator((Integer) criteriaHash.get("operator"));
+      } catch (QueryFormulationException e) {
+        System.out.println("Error generating Boolean Query.");
+      }
+      @SuppressWarnings("unchecked")
+      List<Map<String, Object>> terms = (List<Map<String, Object>>) criteriaHash.get("terms");
+      for (Map<String, Object> term : terms) {
+        QueryCriteria termCriteria = getQueryCriteriaFromXmlRpc(term);
+        try {
+          ((BooleanQueryCriteria) criteria).addTerm(termCriteria);
+        } catch (QueryFormulationException e) {
+          System.out.println("Error generating Boolean Query.");
+        }
+      }
+
+    }
+
+    return criteria;
+
+  }
 
 }

http://git-wip-us.apache.org/repos/asf/oodt/blob/8705ccf4/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java b/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
index 0f10a81..63d1eb6 100644
--- a/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
+++ b/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
@@ -487,15 +487,17 @@ public class Metadata {
       this.children = new Hashtable<String, Group>();
     }
 
+    /**
+     * Create Metadata Group.
+     * By default we create a group using a Hashtable for XMLRPC support. Once this has been superceeded by the Avro
+     * Impl we should make the HashMap implementation the default.
+     * @param name
+     * @param legacy
+     */
     public Group(String name, boolean legacy) {
       this.name = name;
       this.values = new Vector<String>();
-      if(legacy){
-        this.children = new Hashtable<String, Group>();
-      }
-      else{
-        this.children = new ConcurrentHashMap<String, Group>();
-      }
+      this.children = legacy ? new Hashtable<String, Group>() : new ConcurrentHashMap<String, Group>();
 
     }
 


[4/6] oodt git commit: OODT-917 alter XMLRPC interface to support more generic map types where suitable

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/oodt/blob/8705ccf4/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManagerClient.java
----------------------------------------------------------------------
diff --git 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
index cb80e08..5e84249 100644
--- 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
@@ -55,8 +55,8 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.URL;
 import java.util.Hashtable;
-import java.util.Map;
 import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -66,1334 +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 {
 
-    /* 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 {
-        // 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 + "]");
-            }
-
-        }
-
-        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)) {
-                                    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 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;
-  
-      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;
-      }
-  
-      return success;
-  }
-
-    public boolean isAlive() {
-        boolean connected;
+  /* our xml rpc client */
+  private XmlRpcClient client = null;
 
-        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;
-        }
+  /* 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>();
-        Map<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;
+  public XmlRpcFileManagerClient(final URL url) throws ConnectionException {
+    this(url, true);
+  }
 
-        try {
-            success = (Boolean) client.execute("filemgr.transferringProduct",
-                argList);
-        } catch (XmlRpcException e) {
-            throw new DataTransferException(e);
-        } catch (IOException e) {
-            throw new DataTransferException(e);
-        }
+  /**
+   * <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 {
-        Map<String, Object> productHash = XmlRpcStructFactory
-                .getXmlRpcProduct(product);
-        Vector<Object> argList = new Vector<Object>();
-        argList.add(productHash);
-
-        boolean success;
+    XmlRpcTransportFactory transportFactory = new XmlRpcTransportFactory() {
 
-        try {
-            success = (Boolean) client.execute(
-                "filemgr.removeProductTransferStatus", argList);
-        } catch (XmlRpcException e) {
-            throw new DataTransferException(e);
-        } catch (IOException e) {
-            throw new DataTransferException(e);
-        }
+      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 {
-        Map<String, Object> productHash = XmlRpcStructFactory
-                .getXmlRpcProduct(product);
-        Vector<Object> argList = new Vector<Object>();
-        argList.add(productHash);
+      public void setProperty(String arg0, Object arg1) {
+      }
 
-        boolean success;
+    };
 
-        try {
-            success = (Boolean) client.execute("filemgr.isTransferComplete",
-                argList);
-        } catch (XmlRpcException e) {
-            throw new DataTransferException(e);
-        } catch (IOException e) {
-            throw new DataTransferException(e);
-        }
+    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 {
-        Map<String, Object> productHash = XmlRpcStructFactory
-                .getXmlRpcProduct(product);
-        Vector<Object> argList = new Vector<Object>();
-        argList.add(productHash);
-        argList.add(newPath);
-
-        boolean success;
+  }
 
-        try {
-            success = (Boolean) client.execute("filemgr.moveProduct", argList);
-        } catch (XmlRpcException e) {
-            throw new DataTransferException(e);
-        } catch (IOException e) {
-            throw new DataTransferException(e);
-        }
+  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 {
-        Map<String, Object> productHash = XmlRpcStructFactory
-                .getXmlRpcProduct(product);
-
-        Vector<Object> argList = new Vector<Object>();
-        argList.add(productHash);
-
-        boolean success;
-
-        try {
-            success = (Boolean) client.execute("filemgr.modifyProduct",
-                argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+    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 {
-        Map<String, Object> productHash = XmlRpcStructFactory
-                .getXmlRpcProduct(product);
-
-        Vector<Object> argList = new Vector<Object>();
-        argList.add(productHash);
-
-        boolean success;
+    return connected;
+  }
 
-        try {
-            success = (Boolean) client.execute("filemgr.removeProduct",
-                argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+  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>();
-
-        Map<String, Object> statusHash;
-        FileTransferStatus status = null;
+    return success;
+  }
 
-        try {
-            statusHash = (Map<String, Object>) client.execute(
-                    "filemgr.getCurrentFileTransfer", argList);
-        } catch (XmlRpcException e) {
-            throw new DataTransferException(e);
-        } catch (IOException e) {
-            throw new DataTransferException(e);
-        }
+  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<Map<String, Object>> statusVector;
-        List<FileTransferStatus> statuses = null;
+    return success;
+  }
 
-        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);
-        }
+  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>();
-        Map<String, Object> productHash = XmlRpcStructFactory
-                .getXmlRpcProduct(product);
-        argList.add(productHash);
-        Double pct;
+    return success;
+  }
 
-        try {
-            pct = (Double) client.execute("filemgr.getProductPctTransferred",
-                    argList);
-        } catch (XmlRpcException e) {
-            throw new DataTransferException(e);
-        } catch (IOException e) {
-            throw new DataTransferException(e);
-        }
+  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;
-        }
+    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>();
-        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);
-        }
-
-        if (pct != null) {
-            return pct;
-        }
-
-        return -1.0;
-    }
+    return success;
+  }
 
-    @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);
+  public boolean modifyProduct(Product product) throws CatalogException {
+    Map<String, Object> productHash = XmlRpcStructFactory
+        .getXmlRpcProduct(product);
 
-        Map<String, Object> pageHash;
+    Vector<Object> argList = new Vector<Object>();
+    argList.add(productHash);
 
-        try {
-            pageHash = (Map<String, Object>) client.execute(
-                    "filemgr.pagedQuery", argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+    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;
-        Map<String, Object> pageHash;
+  }
 
-        try {
-            pageHash = (Map<String, Object>) client.execute(
-                    "filemgr.getFirstPage", argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+  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;
-        Map<String, Object> pageHash;
+  }
 
-        try {
-            pageHash = (Map<String, Object>) client.execute(
-                    "filemgr.getLastPage", argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+  @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));
-
-        ProductPage page = null;
-        Map<String, Object> pageHash;
-
-        try {
-            pageHash = (Map<String, Object>) client.execute(
-                    "filemgr.getNextPage", argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
-
-        if (pageHash != null) {
-            page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
-        }
-
-        return page;
+    if (statusHash != null) {
+      status = XmlRpcStructFactory
+          .getFileTransferStatusFromXmlRpc(statusHash);
     }
 
-    @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;
-        Map<String, Object> pageHash;
+    return status;
+  }
 
-        try {
-            pageHash = (Map<String, Object>) client.execute(
-                    "filemgr.getPrevPage", argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+  @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);
     }
 
-    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);
+    if (statusVector != null) {
+      statuses = XmlRpcStructFactory
+          .getFileTransferStatusesFromXmlRpc(statusVector);
+    }
 
-        try {
-            productTypeId = (String) client.execute("filemgr.addProductType",
-                    argList);
-        } catch (XmlRpcException e) {
-            throw new RepositoryManagerException(e);
-        } catch (IOException e) {
-            throw new RepositoryManagerException(e);
-        }
+    return statuses;
+  }
 
-        return productTypeId;
+  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;
 
+    try {
+      pct = (Double) client.execute("filemgr.getProductPctTransferred",
+          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;
+    return -1.0;
+  }
 
-        try {
-            hasProduct = (Boolean) client.execute("filemgr.hasProduct",
-                argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+  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;
 
-        return hasProduct;
+    try {
+      pct = (Double) client.execute("filemgr.getRefPctTransferred",
+          argList);
+    } catch (XmlRpcException e) {
+      throw new DataTransferException(e);
+    } catch (IOException e) {
+      throw new DataTransferException(e);
+    }
 
+    if (pct != null) {
+      return pct;
     }
 
-    public int getNumProducts(ProductType type) throws CatalogException {
-        Vector<Object> argList = new Vector<Object>();
-        argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
+    return -1.0;
+  }
 
-        Integer numProducts;
+  @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);
 
-        try {
-            numProducts = (Integer) client.execute("filemgr.getNumProducts",
-                    argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+    Map<String, Object> pageHash;
 
-        return numProducts;
+    try {
+      pageHash = (Map<String, Object>) client.execute(
+          "filemgr.pagedQuery", 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(n);
+    return XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
+  }
 
-        Vector<Map<String, Object>> topNProducts;
+  @SuppressWarnings("unchecked")
+  public ProductPage getFirstPage(ProductType type) throws CatalogException {
+    Vector<Object> argList = new Vector<Object>();
+    argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
 
-        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);
-        }
+    ProductPage page = null;
+    Map<String, Object> pageHash;
 
-      return XmlRpcStructFactory
-              .getProductListFromXmlRpc(topNProducts);
+    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, ProductType type)
-            throws CatalogException {
-        Vector<Object> argList = new Vector<Object>();
-        argList.add(n);
-        Map<String, Object> productTypeHash = XmlRpcStructFactory
-                .getXmlRpcProductType(type);
-        argList.add(productTypeHash);
-
-        Vector<Map<String, Object>> topNProducts;
+    if (pageHash != null) {
+      page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
+    }
 
-        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);
-        }
+    return page;
 
-      return XmlRpcStructFactory
-              .getProductListFromXmlRpc(topNProducts);
-    }
+  }
 
-    public void setProductTransferStatus(Product product)
-            throws CatalogException {
-        Vector<Object> argList = new Vector<Object>();
-        Map<String, Object> productHash = XmlRpcStructFactory
-                .getXmlRpcProduct(product);
-        argList.add(productHash);
+  @SuppressWarnings("unchecked")
+  public ProductPage getLastPage(ProductType type) throws CatalogException {
+    Vector<Object> argList = new Vector<Object>();
+    argList.add(XmlRpcStructFactory.getXmlRpcProductType(type));
 
-        try {
-            client.execute("filemgr.setProductTransferStatus", argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+    ProductPage page = null;
+    Map<String, Object> pageHash;
 
+    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 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);
-        }
+    if (pageHash != null) {
+      page = XmlRpcStructFactory.getProductPageFromXmlRpc(pageHash);
     }
 
-  public void addMetadata(Product product, Metadata metadata)
-      throws CatalogException {
+    return page;
+  }
 
+  @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);
     } catch (IOException e) {
       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;
+    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);
     } catch (IOException e) {
       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;
+    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);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+    return productTypeId;
+
+  }
+
+  public boolean hasProduct(String productName) throws CatalogException {
+    Vector<Object> argList = new Vector<Object>();
+    argList.add(productName);
+
+    boolean hasProduct;
 
-        return productId;
+    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>();
-        Map<String, Object> productHash = XmlRpcStructFactory
-                .getXmlRpcProduct(product);
-        argList.add(productHash);
+    return hasProduct;
 
-        Map<String, Object> metadata;
+  }
 
-        try {
-            metadata = (Map<String, Object>) client.execute(
-                    "filemgr.getMetadata", 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));
 
-        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>();
-        Map<String, Object> productHash = XmlRpcStructFactory
-                .getXmlRpcProduct(product);
-        argList.add(productHash);
-        argList.add(new Vector(elements));
-
-        Map<String, Object> metadata;
+    return numProducts;
+  }
 
-        try {
-            metadata = (Map<String, Object>) client.execute(
-                    "filemgr.getReducedMetadata", 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(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;
+  @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);
-        } catch (XmlRpcException e) {
-            throw new DataTransferException(e);
-        } catch (IOException e) {
-            throw new DataTransferException(e);
-        }
+    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(offset);
-      argList.add(numBytes);
+    return XmlRpcStructFactory
+        .getProductListFromXmlRpc(topNProducts);
+  }
 
-      try {
-         return (byte[]) client.execute("filemgr.retrieveFile", argList);
-      } catch (XmlRpcException e) {
-         throw new DataTransferException(e);
-      } catch (IOException e) {
-         throw new DataTransferException(e);
-      }
-   }
+  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(offset);
-        argList.add(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);
-        } catch (IOException e) {
-            throw new DataTransferException(e);
-        }
+  }
+
+  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>();
-        Map<String, Object> productTypeHash = XmlRpcStructFactory
-                .getXmlRpcProductType(type);
-        argList.add(productTypeHash);
+  public void addMetadata(Product product, Metadata metadata)
+      throws CatalogException {
 
-        Vector<Map<String, Object>> productVector;
+    Vector<Object> argList = new Vector<Object>();
+    argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
+    argList.add(metadata.getHashTable());
 
-        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);
-        }
+    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>();
-        Map<String, Object> productTypeHash = XmlRpcStructFactory
-                .getXmlRpcProductType(type);
+    return result;
 
-        argList.add(productTypeHash);
+  }
 
-        Vector<Map<String, Object>> elementVector;
+  public String catalogProduct(Product product) throws CatalogException {
+    Vector<Object> argList = new Vector<Object>();
+    argList.add(XmlRpcStructFactory.getXmlRpcProduct(product));
 
-        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);
-        }
+    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;
+  @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);
-        } catch (IOException e) {
-            throw new ValidationLayerException(e);
-        }
+    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;
+  }
 
-        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", "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);
     }
 
-    @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));
+    Metadata m = new Metadata();
+    m.addMetadata(metadata);
+    return m;
 
-        Hashtable<String, Object> elementHash;
+  }
 
-        try {
-            elementHash = (Hashtable<String, Object>) client.execute(
-                    "filemgr.getElementByName", argList);
-        } catch (XmlRpcException e) {
-            throw new ValidationLayerException(e);
-        } catch (IOException e) {
-            throw new ValidationLayerException(e);
-        }
+  public boolean removeFile(String filePath) throws DataTransferException {
+    Vector<Object> argList = new Vector<Object>();
+    argList.add(filePath);
 
-        if (elementHash == null) {
-            return null;
-        } else {
-            return XmlRpcStructFactory.getElementFromXmlRpc(elementHash);
-        }
-    }
+    boolean success;
 
-    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 {
+      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>();
-        Map<String, Object> queryHash = XmlRpcStructFactory
-                .getXmlRpcQuery(query);
-        Map<String, Object> typeHash = XmlRpcStructFactory
-                .getXmlRpcProductType(type);
-        argList.add(queryHash);
-        argList.add(typeHash);
+    return success;
+  }
 
-        Vector<Map<String, Object>> productVector;
+  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<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);
-        }
+    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;
-        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);
-        }
+    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;
-        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);
-        } catch (IOException e) {
-            throw new RepositoryManagerException(e);
-        }
+  @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<Map<String, Object>> productTypeVector;
+  @SuppressWarnings("unchecked")
+  public Element getElementById(String elementId)
+      throws ValidationLayerException {
+    Vector<Object> argList = new Vector<Object>();
+    argList.add(elementId);
 
-        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);
-        }
+    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<Map<String, Object>> productReferenceVector;
-        Map<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<Map<String, Object>>) client
-                    .execute("filemgr.getProductReferences", argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+    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);
+    }
+  }
 
-        Map<String, Object> productHash;
-        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 = (Map<String, Object>) client.execute(
-                    "filemgr.getProductById", argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+    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);
+    }
+  }
+
+  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);
+    }
+  }
 
-        Map<String, Object> productHash;
-        argList.add(productName);
+  @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);
 
-        try {
-            productHash = (Map<String, Object>) client.execute(
-                    "filemgr.getProductByName", argList);
-        } catch (XmlRpcException e) {
-            throw new CatalogException(e);
-        } catch (IOException e) {
-            throw new CatalogException(e);
-        }
+    Vector<Map<String, Object>> productVector;
 
-        if (productHash == null) {
-            return null;
-        } else {
-            return XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        }
+    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 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 (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());
-                  if (versioner != null) {
-                    versioner.createDataStoreReferences(product, metadata);
-                  }
+    if (productTypeHash == null) {
+      return null;
+    } else {
+      return XmlRpcStructFactory
+          .getProductTypeFromXmlRpc(productTypeHash);
+    }
+  }
 
-                  // 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);
-                }
+  @SuppressWarnings("unchecked")
+  public ProductType getProductTypeById(String productTypeId)
+      throws RepositoryManagerException {
+    Hashtable<String, Object> productTypeHash;
+    Vector<Object> argList = new Vector<Object>();
+    argList.add(productTypeId);
 
-            }
-            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);
-        }
+    try {
+      productTypeHash = (Hashtable<String, Object>) client.execute(
+          "filemgr.getProductTypeById", argList);
+    } catch (XmlRpcException e) {
+      throw new RepositoryManagerException(e);
+    } catch (IOException e) {
+      throw new RepositoryManagerException(e);
+    }
 
+    if (productTypeHash == null) {
+      return null;
+    } else {
+      return XmlRpcStructFactory
+          .getProductTypeFromXmlRpc(productTypeHash);
     }
+  }
+
+  @SuppressWarnings("unchecked")
+  public List<ProductType> getProductTypes()
+      throws RepositoryManagerException {
+    Vector<Object> argList = new Vector<Object>();
 
-    @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));
+    Vector<Map<String, Object>> productTypeVector;
 
-        Metadata m = new Metadata();
-        m.addMetadata((Map<String, Object>) this.client.execute(
-                "filemgr.getCatalogValues", args));
+    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);
+    }
 
-        return m;
+    if (productTypeVector == null) {
+      return null;
+    } else {
+      return XmlRpcStructFactory
+          .getProductTypeListFromXmlRpc(productTypeVector);
     }
+  }
 
-    @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));
+  @SuppressWarnings("unchecked")
+  public List<Reference> getProductReferences(Product product)
+      throws CatalogException {
+    Vector<Object> argList = new Vector<Object>();
 
-        Metadata m = new Metadata();
-        m.addMetadata((Map<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);
     }
+  }
+
+  @SuppressWarnings("unchecked")
+  public Product getProductById(String productId) throws CatalogException {
+    Vector<Object> argList = new Vector<Object>();
 
-    public static void main(String[] args) {
-       CmdLineUtility cmdLineUtility = new CmdLineUtility();
-       cmdLineUtility.run(args);
+    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);
     }
 
-    /**
-     * @return Returns the fileManagerUrl.
-     */
-    public URL getFileManagerUrl() {
-        return fileManagerUrl;
+    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 the fileManagerUrl.
+   */
+  public URL getFileManagerUrl() {
+    return fileManagerUrl;
+  }
+
+  /**
+   * @param fileManagerUrl The fileManagerUrl to set.
+   */
+  public void setFileManagerUrl(URL fileManagerUrl) {
+    this.fileManagerUrl = fileManagerUrl;
+
+    // reset the client
+    this.client = new XmlRpcClient(fileManagerUrl);
+  }
+
+  /**
+   * @return Returns the dataTransfer.
+   */
+  public DataTransfer getDataTransfer() {
+    return dataTransfer;
+  }
+
+  /**
+   * @param dataTransfer The dataTransfer to set.
+   */
+  public void setDataTransfer(DataTransfer dataTransfer) {
+    this.dataTransfer = dataTransfer;
+    this.dataTransfer.setFileManagerUrl(this.fileManagerUrl);
+  }
+
 }


[2/6] oodt git commit: OODT-917 alter XMLRPC interface to support more generic map types where suitable

Posted by ma...@apache.org.
OODT-917 alter XMLRPC interface to support more generic map types where suitable


Project: http://git-wip-us.apache.org/repos/asf/oodt/repo
Commit: http://git-wip-us.apache.org/repos/asf/oodt/commit/3e0e5972
Tree: http://git-wip-us.apache.org/repos/asf/oodt/tree/3e0e5972
Diff: http://git-wip-us.apache.org/repos/asf/oodt/diff/3e0e5972

Branch: refs/heads/master
Commit: 3e0e5972a6f6466add63d4edd204264eb3f50499
Parents: aa5e31a
Author: Tom Barber <to...@analytical-labs.com>
Authored: Wed Nov 4 12:09:13 2015 +0000
Committer: Tom Barber <to...@analytical-labs.com>
Committed: Wed Nov 4 12:09:13 2015 +0000

----------------------------------------------------------------------
 .../cas/filemgr/system/XmlRpcFileManager.java   | 573 ++++++-------------
 .../filemgr/system/XmlRpcFileManagerClient.java |  42 +-
 .../cas/filemgr/util/XmlRpcStructFactory.java   | 261 +++------
 .../org/apache/oodt/cas/metadata/Metadata.java  |  16 +-
 4 files changed, 275 insertions(+), 617 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/oodt/blob/3e0e5972/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
----------------------------------------------------------------------
diff --git a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
index 4be4dc1..e5ad57b 100644
--- a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
+++ b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
@@ -56,6 +56,7 @@ import org.apache.xmlrpc.WebServer;
 
 import com.google.common.collect.Lists;
 
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -162,13 +163,17 @@ public class XmlRpcFileManager {
       return status;
     }
 
-    public boolean transferringProduct(Map<String, Object> productHash) {
+  public boolean transferringProduct(Hashtable<String, Object> productHash) {
+    return this.transferringProductCore(productHash);
+  }
+
+  public boolean transferringProductCore(Map<String, Object> productHash) {
         Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
         transferStatusTracker.transferringProduct(p);
         return true;
     }
 
-    public Map<String, Object> getCurrentFileTransfer() {
+    public Map<String, Object> getCurrentFileTransferCore() {
         FileTransferStatus status = transferStatusTracker
                 .getCurrentFileTransfer();
         if (status == null) {
@@ -189,12 +194,18 @@ public class XmlRpcFileManager {
         }
     }
 
-    public double getProductPctTransferred(Map<String, Object> productHash) {
+  public double getProductPctTransferred(Hashtable<String, Object> productHash) {
+    return this.getProductPctTransferredCore(productHash);
+  }
+    public double getProductPctTransferredCore(Map<String, Object> productHash) {
         Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
       return transferStatusTracker.getPctTransferred(product);
     }
 
-    public double getRefPctTransferred(Map<String, Object> refHash) {
+  public double getRefPctTransferred(Hashtable<String, Object> refHash) {
+    return getRefPctTransferredCore(refHash);
+  }
+    public double getRefPctTransferredCore(Map<String, Object> refHash) {
         Reference reference = XmlRpcStructFactory
                 .getReferenceFromXmlRpc(refHash);
         double pct = 0.0;
@@ -211,18 +222,29 @@ public class XmlRpcFileManager {
         return pct;
     }
 
-    public boolean removeProductTransferStatus(Map<String, Object> productHash) {
+  public boolean removeProductTransferStatus(Hashtable<String, Object> productHash) {
+    return removeProductTransferStatusCore(productHash);
+  }
+    public boolean removeProductTransferStatusCore(Map<String, Object> productHash) {
         Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
         transferStatusTracker.removeProductTransferStatus(product);
         return true;
     }
-
-    public boolean isTransferComplete(Map<String, Object> productHash) {
+  public boolean isTransferComplete(Hashtable<String, Object> productHash) {
+    return this.isTransferCompleteCore(productHash);
+  }
+    public boolean isTransferCompleteCore(Map<String, Object> productHash) {
         Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
         return transferStatusTracker.isTransferComplete(product);
     }
+  public Map<String, Object> pagedQuery(
+      Hashtable<String, Object> queryHash,
+      Hashtable<String, Object> productTypeHash,
+      int pageNum) throws CatalogException {
+  return this.pagedQueryCore(queryHash,productTypeHash,pageNum);
+  }
 
-    public Map<String, Object> pagedQuery(
+    public Map<String, Object> pagedQueryCore(
             Map<String, Object> queryHash,
             Map<String, Object> productTypeHash,
             int pageNum) throws CatalogException {
@@ -256,23 +278,13 @@ public class XmlRpcFileManager {
         return XmlRpcStructFactory.getXmlRpcProductPage(prodPage);
     }
 
-    public Map<String, Object> getFirstPage(
-            Map<String, Object> productTypeHash) {
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        ProductPage page = catalog.getFirstPage(type);
-        try {
-            setProductType(page.getPageProducts());
-        } catch (Exception e) {
-            LOG.log(Level.WARNING,
-                    "Unable to set product types for product page list: ["
-                            + page + "]");
-        }
-        return XmlRpcStructFactory.getXmlRpcProductPage(page);
-    }
+  public Map<String, Object> getFirstPage(
+      Hashtable<String, Object> productTypeHash){
+    return this.getFirstPageCore(productTypeHash);
+  }
 
-  public Hashtable<String, Object> getFirstPage(
-      Hashtable<String, Object> productTypeHash) {
+  public Map<String, Object> getFirstPageCore(
+      Map<String, Object> productTypeHash) {
     ProductType type = XmlRpcStructFactory
         .getProductTypeFromXmlRpc(productTypeHash);
     ProductPage page = catalog.getFirstPage(type);
@@ -286,7 +298,12 @@ public class XmlRpcFileManager {
     return XmlRpcStructFactory.getXmlRpcProductPage(page);
   }
 
-    public Map<String, Object> getLastPage(
+
+  public Map<String, Object> getLastPage(
+      Hashtable<String, Object> productTypeHash){
+    return this.getLastPageCore(productTypeHash);
+  }
+    public Map<String, Object> getLastPageCore(
             Map<String, Object> productTypeHash) {
         ProductType type = XmlRpcStructFactory
                 .getProductTypeFromXmlRpc(productTypeHash);
@@ -301,7 +318,12 @@ public class XmlRpcFileManager {
         return XmlRpcStructFactory.getXmlRpcProductPage(page);
     }
 
-    public Map<String, Object> getNextPage(
+  public Map<String, Object> getNextPage(
+      Hashtable<String, Object> productTypeHash,
+      Hashtable<String, Object> currentPageHash){
+    return this.getNextPageCore(productTypeHash, currentPageHash);
+  }
+    public Map<String, Object> getNextPageCore(
             Map<String, Object> productTypeHash,
             Map<String, Object> currentPageHash) {
         ProductType type = XmlRpcStructFactory
@@ -318,8 +340,12 @@ public class XmlRpcFileManager {
         }
         return XmlRpcStructFactory.getXmlRpcProductPage(page);
     }
-
-    public Map<String, Object> getPrevPage(
+  public Map<String, Object> getPrevPage(
+      Hashtable<String, Object> productTypeHash,
+      Hashtable<String, Object> currentPageHash){
+    return this.getPrevPageCore(productTypeHash, currentPageHash);
+  }
+  public Map<String, Object> getPrevPageCore(
             Map<String, Object> productTypeHash,
             Map<String, Object> currentPageHash) {
         ProductType type = XmlRpcStructFactory
@@ -337,7 +363,12 @@ public class XmlRpcFileManager {
         return XmlRpcStructFactory.getXmlRpcProductPage(page);
     }
 
-    public String addProductType(Map<String, Object> productTypeHash)
+  public String addProductType(Hashtable<String, Object> productTypeHash)
+      throws RepositoryManagerException {
+    return this.addProductTypeCore(productTypeHash);
+  }
+
+    public String addProductTypeCore(Map<String, Object> productTypeHash)
             throws RepositoryManagerException {
         ProductType productType = XmlRpcStructFactory
                 .getProductTypeFromXmlRpc(productTypeHash);
@@ -346,44 +377,26 @@ public class XmlRpcFileManager {
 
     }
 
-    public synchronized boolean setProductTransferStatus(
-            Map<String, Object> productHash)
-            throws CatalogException {
-        Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        catalog.setProductTransferStatus(product);
-        return true;
-    }
-
   public synchronized boolean setProductTransferStatus(
       Hashtable<String, Object> productHash)
       throws CatalogException {
+    return this.setProductTransferStatusCore(productHash);
+  }
+
+  public synchronized boolean setProductTransferStatusCore(
+      Map<String, Object> productHash)
+      throws CatalogException {
     Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
     catalog.setProductTransferStatus(product);
     return true;
   }
 
-  public int getNumProducts(Map<String, Object> productTypeHash)
-            throws CatalogException {
-        int numProducts;
-
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-
-        try {
-            numProducts = catalog.getNumProducts(type);
-        } catch (CatalogException e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.WARNING,
-                    "Exception when getting num products: Message: "
-                            + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        }
-
-        return numProducts;
-    }
-
   public int getNumProducts(Hashtable<String, Object> productTypeHash)
       throws CatalogException {
+    return this.getNumProductsCore(productTypeHash);
+  }
+  public int getNumProductsCore(Map<String, Object> productTypeHash)
+      throws CatalogException {
     int numProducts;
 
     ProductType type = XmlRpcStructFactory
@@ -418,7 +431,7 @@ public class XmlRpcFileManager {
         }
     }
 
-  public List<Hashtable<String, Object>> getTopNProducts(int n)
+  public List<Map<String, Object>> getTopNProducts(int n)
       throws CatalogException {
     List<Product> topNProducts;
 
@@ -434,27 +447,12 @@ public class XmlRpcFileManager {
     }
   }
 
-  public List<Hashtable<String, Object>> getTopNProducts(int n,
+  public List<Map<String, Object>> getTopNProducts(int n,
                                                    Hashtable<String, Object> productTypeHash)
       throws CatalogException {
-    ProductType type = XmlRpcStructFactory
-        .getProductTypeFromXmlRpc(productTypeHash);
-    List<Product> topNProducts;
-
-    try {
-      topNProducts = catalog.getTopNProducts(n, type);
-      return XmlRpcStructFactory.getXmlRpcProductList(topNProducts);
-    } catch (Exception e) {
-      LOG.log(Level.SEVERE, e.getMessage());
-      LOG.log(Level.WARNING,
-          "Exception when getting topN products by product type: ["
-          + type.getProductTypeId() + "]: Message: "
-          + e.getMessage());
-      throw new CatalogException(e.getMessage(), e);
-    }
-
+    return this.getTopNProductsCore(n, productTypeHash);
   }
-    public List<Map<String, Object>> getTopNProducts(int n,
+    public List<Map<String, Object>> getTopNProductsCore(int n,
             Map<String, Object> productTypeHash)
             throws CatalogException {
         ProductType type = XmlRpcStructFactory
@@ -481,31 +479,29 @@ public class XmlRpcFileManager {
                 && p.getTransferStatus().equals(Product.STATUS_RECEIVED);
     }
 
-    public Map<String, Object> getMetadata(
+
+  public Map<String, Object> getMetadata(
+      Hashtable<String, Object> productHash) throws CatalogException {
+    return this.getMetadataCore(productHash);
+  }
+    public Map<String, Object> getMetadataCore(
         Map<String, Object> productHash) throws CatalogException {
         Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        return this.getMetadata(product).getMap();
+        return this.getMetadata(product).getHashTable();
     }
 
-  public Hashtable<String, Object> getMetadata(
-      Hashtable<String, Object> productHash) throws CatalogException {
-    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-    return this.getMetadata(product).getHashTable();
+  public Map<String, Object> getReducedMetadata(
+      Hashtable<String, Object> productHash, Vector<String> elements)
+      throws CatalogException {
+    return this.getReducedMetadataCore(productHash, elements);
   }
-
-    public Map<String, Object> getReducedMetadata(
+    public Map<String, Object> getReducedMetadataCore(
             Map<String, Object> productHash, Vector<String> elements)
             throws CatalogException {
         Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        return this.getReducedMetadata(product, elements).getMap();
+        return this.getReducedMetadata(product, elements).getHashTable();
     }
 
-  public Hashtable<String, Object> getReducedMetadata(
-      Hashtable<String, Object> productHash, Vector<String> elements)
-      throws CatalogException {
-    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-    return this.getReducedMetadata(product, elements).getHashTable();
-  }
     public List<Map<String, Object>> getProductTypes()
             throws RepositoryManagerException {
         List<ProductType> productTypeList;
@@ -523,28 +519,15 @@ public class XmlRpcFileManager {
         }
     }
 
-    public List<Map<String, Object>> getProductReferences(
-            Map<String, Object> productHash)
-            throws CatalogException {
-        List<Reference> referenceList;
-        Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-
-        try {
-            referenceList = catalog.getProductReferences(product);
-            return XmlRpcStructFactory.getXmlRpcReferencesMap(referenceList);
-        } catch (CatalogException e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE, "Unable to obtain references for product: ["
-                    + product.getProductName() + "]: Message: "
-                    + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        }
-
-    }
-
-  public List<Hashtable<String, Object>> getProductReferences(
+  public List<Map<String, Object>> getProductReferences(
       Hashtable<String, Object> productHash)
       throws CatalogException {
+    return this.getProductReferencesCore(productHash);
+  }
+
+  public List<Map<String, Object>> getProductReferencesCore(
+      Map<String, Object> productHash)
+      throws CatalogException {
     List<Reference> referenceList;
     Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
 
@@ -617,7 +600,12 @@ public class XmlRpcFileManager {
         }
     }
 
-    public List<Map<String, Object>> getProductsByProductType(
+  public List<Map<String, Object>> getProductsByProductType(
+      Hashtable<String, Object> productTypeHash)
+      throws CatalogException {
+    return this.getProductsByProductTypeCore(productTypeHash);
+  }
+    public List<Map<String, Object>> getProductsByProductTypeCore(
             Map<String, Object> productTypeHash)
             throws CatalogException {
         ProductType type = XmlRpcStructFactory
@@ -636,24 +624,6 @@ public class XmlRpcFileManager {
         }
     }
 
-  public List<Hashtable<String, Object>> getProductsByProductType(
-      Hashtable<String, Object> productTypeHash)
-      throws CatalogException {
-    ProductType type = XmlRpcStructFactory
-        .getProductTypeFromXmlRpc(productTypeHash);
-    List<Product> productList;
-
-    try {
-      productList = catalog.getProductsByProductType(type);
-      return XmlRpcStructFactory.getXmlRpcProductList(productList);
-    } catch (Exception e) {
-      LOG.log(Level.SEVERE, e.getMessage());
-      LOG.log(Level.SEVERE,
-          "Exception obtaining products by product type for type: ["
-          + type.getName() + "]: Message: " + e.getMessage());
-      throw new CatalogException(e.getMessage(), e);
-    }
-  }
     public List<Map<String, Object>> getElementsByProductType(
             Map<String, Object> productTypeHash)
             throws ValidationLayerException {
@@ -706,7 +676,11 @@ public class XmlRpcFileManager {
         }
     }
 
-    public List<Map<String, Object>> complexQueryMap(
+  public List<Map<String,Object>> complexQuery(Hashtable<String, Object> complexQueryHash) throws CatalogException{
+    return this.complexQueryCore(complexQueryHash);
+  }
+
+    public List<Map<String, Object>> complexQueryCore(
             Map<String, Object> complexQueryHash) throws CatalogException {
         try {
             ComplexQuery complexQuery = XmlRpcStructFactory
@@ -766,81 +740,17 @@ public class XmlRpcFileManager {
                     + e.getMessage(), e);
         }
     }
-
-  public List<Hashtable<String, Object>> complexQuery(
-      Hashtable<String, Object> complexQueryHash) throws CatalogException {
-    try {
-      ComplexQuery complexQuery = XmlRpcStructFactory
-          .getComplexQueryFromXmlRpc(complexQueryHash);
-
-      // get ProductTypes
-      List<ProductType> productTypes;
-      if (complexQuery.getReducedProductTypeNames() == null) {
-        productTypes = this.repositoryManager.getProductTypes();
-      } else {
-        productTypes = new Vector<ProductType>();
-        for (String productTypeName : complexQuery
-            .getReducedProductTypeNames()) {
-          productTypes.add(this.repositoryManager
-              .getProductTypeByName(productTypeName));
-        }
-      }
-
-      // get Metadata
-      List<QueryResult> queryResults = new LinkedList<QueryResult>();
-      for (ProductType productType : productTypes) {
-        List<String> productIds = catalog.query(this.getCatalogQuery(
-            complexQuery, productType), productType);
-        for (String productId : productIds) {
-          Product product = catalog.getProductById(productId);
-          product.setProductType(productType);
-          QueryResult qr = new QueryResult(product, this
-              .getReducedMetadata(product, complexQuery
-                  .getReducedMetadata()));
-          qr.setToStringFormat(complexQuery
-              .getToStringResultFormat());
-          queryResults.add(qr);
-        }
-      }
-
-      LOG.log(Level.INFO, "Query returned " + queryResults.size()
-                          + " results");
-
-      // filter query results
-      if (complexQuery.getQueryFilter() != null) {
-        queryResults = applyFilterToResults(queryResults, complexQuery
-            .getQueryFilter());
-        LOG.log(Level.INFO, "Filter returned " + queryResults.size()
-                            + " results");
-      }
-
-      // sort query results
-      if (complexQuery.getSortByMetKey() != null) {
-        queryResults = sortQueryResultList(queryResults, complexQuery
-            .getSortByMetKey());
-      }
-
-      return XmlRpcStructFactory.getXmlRpcQueryResults(queryResults);
-    } catch (Exception e) {
-      LOG.log(Level.SEVERE, e.getMessage());
-      throw new CatalogException("Failed to perform complex query : "
-                                 + e.getMessage(), e);
-    }
-  }
-    public List<Map<String, Object>> query(
-            Map<String, Object> queryHash,
-            Map<String, Object> productTypeHash)
-            throws CatalogException {
-        Query query = XmlRpcStructFactory.getQueryFromXmlRpcMap(queryHash);
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        return XmlRpcStructFactory.getXmlRpcProductListMap(this.query(query, type));
-    }
-
-  public List<Hashtable<String, Object>> query(
+  public List<Map<String, Object>> query(
       Hashtable<String, Object> queryHash,
       Hashtable<String, Object> productTypeHash)
       throws CatalogException {
+    return this.queryCore(queryHash, productTypeHash);
+  }
+
+  public List<Map<String, Object>> queryCore(
+      Map<String, Object> queryHash,
+      Map<String, Object> productTypeHash)
+      throws CatalogException {
     Query query = XmlRpcStructFactory.getQueryFromXmlRpc(queryHash);
     ProductType type = XmlRpcStructFactory
         .getProductTypeFromXmlRpc(productTypeHash);
@@ -854,7 +764,7 @@ public class XmlRpcFileManager {
         return XmlRpcStructFactory.getXmlRpcProductType(type);
     }
 
-  public Hashtable<String, Object> getProductTypeByName(String productTypeName)
+  public Map<String, Object> getProductTypeByName(String productTypeName)
       throws RepositoryManagerException {
     ProductType type = repositoryManager
         .getProductTypeByName(productTypeName);
@@ -876,8 +786,13 @@ public class XmlRpcFileManager {
             throw new RepositoryManagerException(e.getMessage(), e);
         }
     }
-    
-    public synchronized boolean updateMetadata(Map<String, Object> productHash, 
+  public synchronized boolean updateMetadata(Hashtable<String, Object> productHash,
+                                                 Hashtable<String, Object> metadataHash) throws CatalogException{
+
+    return this.updateMetadataCore(productHash, metadataHash);
+  }
+
+    public synchronized boolean updateMetadataCore(Map<String, Object> productHash,
         Map<String, Object> metadataHash) throws CatalogException{
         Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
         Metadata met = new Metadata();
@@ -888,28 +803,22 @@ public class XmlRpcFileManager {
         return true;
     }
 
-  public synchronized boolean updateMetadata(Hashtable<String, Object> productHash,
-                                             Hashtable<String, Object> metadataHash) throws CatalogException{
-    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-    Metadata met = new Metadata();
-    met.addMetadata(metadataHash);
-    Metadata oldMetadata = catalog.getMetadata(product);
-    catalog.removeMetadata(oldMetadata, product);
-    catalog.addMetadata(met, product);
-    return true;
+  public synchronized String catalogProduct(Hashtable<String, Object> productHash)
+      throws CatalogException {
+    return this.catalogProductCore(productHash);
+
   }
-    public synchronized String catalogProduct(Map<String, Object> productHash)
+    public synchronized String catalogProductCore(Map<String, Object> productHash)
             throws CatalogException {
         Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
         return catalogProduct(p);
     }
 
-  public synchronized String catalogProduct(Hashtable<String, Object> productHash)
-      throws CatalogException {
-    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-    return catalogProduct(p);
+  public synchronized boolean addMetadata(Hashtable<String, Object> productHash,
+                                          Hashtable<String, String> metadata) throws CatalogException {
+    return this.addMetadataCore(productHash, metadata);
   }
-    public synchronized boolean addMetadata(Map<String, Object> productHash,
+    public synchronized boolean addMetadataCore(Map<String, Object> productHash,
             Map<String, String> metadata) throws CatalogException {
         Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
         Metadata m = new Metadata();
@@ -917,14 +826,7 @@ public class XmlRpcFileManager {
         return addMetadata(p, m) != null;
     }
 
-  public synchronized boolean addMetadata(Hashtable<String, Object> productHash,
-                                          Hashtable<String, String> metadata) throws CatalogException {
-    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-    Metadata m = new Metadata();
-    m.addMetadata((Map)metadata);
-    return addMetadata(p, m) != null;
-  }
-    public synchronized boolean addProductReferences(Map<String, Object> productHash)
+    public synchronized boolean addProductReferencesCore(Map<String, Object> productHash)
             throws CatalogException {
         Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
         return addProductReferences(product);
@@ -932,12 +834,16 @@ public class XmlRpcFileManager {
 
   public synchronized boolean addProductReferences(Hashtable<String, Object> productHash)
       throws CatalogException {
-    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-    return addProductReferences(product);
+    return this.addProductReferencesCore(productHash);
+  }
+
+  public String ingestProduct(Hashtable<String, Object> ph, Hashtable<String, String> m, boolean ct)
+      throws CatalogException {
+    return this.ingestProductCore(ph, m, ct);
   }
 
 
-  public String ingestProduct(Map<String, Object> productHash,
+  public String ingestProductCore(Map<String, Object> productHash,
       Map<String, String> metadata, boolean clientTransfer)
       throws
         CatalogException {
@@ -1012,83 +918,7 @@ public class XmlRpcFileManager {
     }
 
   }
-
-  public String ingestProduct(Hashtable<String, Object> productHash,
-                              Hashtable<String, String> metadata, boolean clientTransfer)
-      throws
-      CatalogException {
-
-    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-
-    try {
-      // first, create the product
-      p.setTransferStatus(Product.STATUS_TRANSFER);
-      catalogProduct(p);
-
-      // now add the metadata
-      Metadata m = new Metadata();
-      m.addMetadata((Map)metadata);
-      Metadata expandedMetdata = addMetadata(p, m);
-
-      // version the product
-      if (!clientTransfer || (Boolean.getBoolean("org.apache.oodt.cas.filemgr.serverside.versioning"))) {
-        Versioner versioner;
-        try {
-          versioner = GenericFileManagerObjectFactory
-              .getVersionerFromClassName(p.getProductType().getVersioner());
-          if (versioner != null) {
-            versioner.createDataStoreReferences(p, expandedMetdata);
-          }
-        } catch (Exception e) {
-          LOG.log(Level.SEVERE,
-              "ingestProduct: VersioningException when versioning Product: "
-              + p.getProductName() + " with Versioner "
-              + p.getProductType().getVersioner() + ": Message: "
-              + e.getMessage());
-          throw new VersioningException(e);
-        }
-
-        // add the newly versioned references to the data store
-        addProductReferences(p);
-      }
-
-      if (!clientTransfer) {
-        LOG.log(Level.FINEST,
-            "File Manager: ingest: no client transfer enabled, "
-            + "server transfering product: [" + p.getProductName() + "]");
-
-        // now transfer the product
-        try {
-          dataTransfer.transferProduct(p);
-          // now update the product's transfer status in the data store
-          p.setTransferStatus(Product.STATUS_RECEIVED);
-
-          try {
-            catalog.setProductTransferStatus(p);
-          } catch (CatalogException e) {
-            LOG.log(Level.SEVERE, "ingestProduct: CatalogException "
-                                  + "when updating product transfer status for Product: "
-                                  + p.getProductName() + " Message: " + e.getMessage());
-            throw e;
-          }
-        } catch (Exception e) {
-          LOG.log(Level.SEVERE,
-              "ingestProduct: DataTransferException when transfering Product: "
-              + p.getProductName() + ": Message: " + e.getMessage());
-          throw new DataTransferException(e);
-        }
-      }
-
-      // that's it!
-      return p.getProductId();
-    } catch (Exception e) {
-      LOG.log(Level.SEVERE, e.getMessage());
-      throw new CatalogException("Error ingesting product [" + p + "] : "
-                                 + e.getMessage(),e);
-    }
-
-  }
-   public byte[] retrieveFile(String filePath, int offset, int numBytes)
+  public byte[] retrieveFile(String filePath, int offset, int numBytes)
          throws DataTransferException {
       FileInputStream is = null;
       try {
@@ -1174,7 +1004,12 @@ public class XmlRpcFileManager {
       return success;
     }
 
-    public boolean moveProduct(Map<String, Object> productHash, String newPath)
+  public boolean moveProduct(Hashtable<String, Object> productHash, String newPath)
+      throws DataTransferException {
+
+    return this.moveProductCore(productHash, newPath);
+  }
+    public boolean moveProductCore(Map<String, Object> productHash, String newPath)
             throws DataTransferException {
 
         Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
@@ -1242,73 +1077,6 @@ public class XmlRpcFileManager {
         }
     }
 
-  public boolean moveProduct(Hashtable<String, Object> productHash, String newPath)
-      throws DataTransferException {
-
-    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-
-    // first thing we care about is if the product is flat or heirarchical
-    if (p.getProductStructure().equals(Product.STRUCTURE_FLAT)) {
-      // we just need to get its first reference
-      if (p.getProductReferences() == null || (p.getProductReferences().size() != 1)) {
-        throw new DataTransferException(
-            "Flat products must have a single reference: cannot move");
-      }
-
-      // okay, it's fine to move it
-      // first, we need to update the data store ref
-      Reference r = p.getProductReferences().get(0);
-      if (r.getDataStoreReference().equals(
-          new File(newPath).toURI().toString())) {
-        throw new DataTransferException("cannot move product: ["
-                                        + p.getProductName() + "] to same location: ["
-                                        + r.getDataStoreReference() + "]");
-      }
-
-      // create a copy of the current data store path: we'll need it to
-      // do the data transfer
-      Reference copyRef = new Reference(r);
-
-      // update the copyRef to have the data store ref as the orig ref
-      // the the newLoc as the new ref
-      copyRef.setOrigReference(r.getDataStoreReference());
-      copyRef.setDataStoreReference(new File(newPath).toURI().toString());
-
-      p.getProductReferences().clear();
-      p.getProductReferences().add(copyRef);
-
-      // now transfer it
-      try {
-        this.dataTransfer.transferProduct(p);
-      } catch (IOException e) {
-        throw new DataTransferException(e);
-      }
-
-      // now delete the original copy
-      try {
-        if (!new File(new URI(copyRef.getOrigReference())).delete()) {
-          LOG.log(Level.WARNING, "Deletion of original file: ["
-                                 + r.getDataStoreReference()
-                                 + "] on product move returned false");
-        }
-      } catch (URISyntaxException e) {
-        throw new DataTransferException(
-            "URI Syntax exception trying to remove original product ref: Message: "
-            + e.getMessage(), e);
-      }
-
-      // now save the updated reference
-      try {
-        this.catalog.modifyProduct(p);
-        return true;
-      } catch (CatalogException e) {
-        throw new DataTransferException(e.getMessage(),e);
-      }
-    } else {
-      throw new UnsupportedOperationException(
-          "Moving of heirarhical and stream products not supported yet");
-    }
-  }
     public boolean removeFile(String filePath) throws DataTransferException, IOException {
       // TODO(bfoster): Clean this up so that it deletes by product not file.
       Product product = new Product();
@@ -1319,7 +1087,10 @@ public class XmlRpcFileManager {
       return true;
     }
 
-    public boolean modifyProduct(Map<?, ?> productHash) throws CatalogException {
+  public boolean modifyProduct(Hashtable<?, ?> productHash) throws CatalogException {
+    return this.modifyProductCore(productHash);
+  }
+    public boolean modifyProductCore(Map<?, ?> productHash) throws CatalogException {
         Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
 
         try {
@@ -1346,48 +1117,46 @@ public class XmlRpcFileManager {
 
         return true;
     }
-    
-    public Map<String, Object> getCatalogValues(
+  public Map<String, Object> getCatalogValues(
+      Hashtable<String, Object> metadataHash,
+      Hashtable<String, Object> productTypeHash)
+      throws RepositoryManagerException {
+    return this.getCatalogValuesCore(metadataHash, productTypeHash);
+  }
+    public Map<String, Object> getCatalogValuesCore(
             Map<String, Object> metadataHash,
             Map<String, Object> productTypeHash)
             throws RepositoryManagerException {
         Metadata m = new Metadata();
         m.addMetadata(metadataHash);
         ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
-        return this.getCatalogValues(m, productType).getMap();
+        return this.getCatalogValues(m, productType).getHashTable();
     }
 
-  public Hashtable<String, Object> getCatalogValues(
+  public Map<String, Object> getOrigValues(
       Hashtable<String, Object> metadataHash,
       Hashtable<String, Object> productTypeHash)
       throws RepositoryManagerException {
-    Metadata m = new Metadata();
-    m.addMetadata(metadataHash);
-    ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
-    return this.getCatalogValues(m, productType).getHashTable();
+    return this.getOrigValuesCore(metadataHash, productTypeHash);
   }
 
-  public Map<String, Object> getOrigValues(
+    public Map<String, Object> getOrigValuesCore(
         Map<String, Object> metadataHash,
         Map<String, Object> productTypeHash)
             throws RepositoryManagerException {
         Metadata m = new Metadata();
         m.addMetadata(metadataHash);
         ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
-        return this.getOrigValues(m, productType).getMap();
+        return this.getOrigValues(m, productType).getHashTable();
     }
 
-  public Hashtable<String, Object> getOrigValues(
-      Hashtable<String, Object> metadataHash,
+  public Map<String, Object> getCatalogQuery(
+      Hashtable<String, Object> queryHash,
       Hashtable<String, Object> productTypeHash)
-      throws RepositoryManagerException {
-    Metadata m = new Metadata();
-    m.addMetadata(metadataHash);
-    ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
-    return this.getOrigValues(m, productType).getHashTable();
+      throws RepositoryManagerException, QueryFormulationException {
+    return this.getCatalogQueryCore(queryHash, productTypeHash);
   }
-    
-    public Map<String, Object> getCatalogQuery(
+    public Map<String, Object> getCatalogQueryCore(
             Map<String, Object> queryHash,
             Map<String, Object> productTypeHash)
             throws RepositoryManagerException, QueryFormulationException {
@@ -1396,14 +1165,6 @@ public class XmlRpcFileManager {
         return XmlRpcStructFactory.getXmlRpcQuery(this.getCatalogQuery(query, productType));
     }
 
-  public Hashtable<String, Object> getCatalogQuery(
-      Hashtable<String, Object> queryHash,
-      Hashtable<String, Object> productTypeHash)
-      throws RepositoryManagerException, QueryFormulationException {
-    Query query = XmlRpcStructFactory.getQueryFromXmlRpc(queryHash);
-    ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
-    return XmlRpcStructFactory.getXmlRpcQuery(this.getCatalogQuery(query, productType));
-  }
 
   public static void main(String[] args) throws IOException {
         int portNum = -1;
@@ -1508,7 +1269,7 @@ public class XmlRpcFileManager {
         }
 
         Metadata met = new Metadata();
-        met.addMetadata(metadata.getMap());
+        met.addMetadata(metadata.getHashTable());
 
         if (product.getProductType().getExtractors() != null) {
             for (ExtractorSpec spec: product.getProductType().getExtractors()) {

http://git-wip-us.apache.org/repos/asf/oodt/blob/3e0e5972/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManagerClient.java
----------------------------------------------------------------------
diff --git 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
index 5c471d9..cb80e08 100644
--- 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
@@ -223,7 +223,7 @@ public class XmlRpcFileManagerClient {
     public boolean transferringProduct(Product product)
             throws DataTransferException {
         Vector<Object> argList = new Vector<Object>();
-        Hashtable<String, Object> productHash = XmlRpcStructFactory
+        Map<String, Object> productHash = XmlRpcStructFactory
                 .getXmlRpcProduct(product);
         argList.add(productHash);
 
@@ -636,10 +636,10 @@ public class XmlRpcFileManagerClient {
         Vector<Object> argList = new Vector<Object>();
         argList.add(n);
 
-        Vector<Hashtable<String, Object>> topNProducts;
+        Vector<Map<String, Object>> topNProducts;
 
         try {
-            topNProducts = (Vector<Hashtable<String, Object>>) client.execute(
+            topNProducts = (Vector<Map<String, Object>>) client.execute(
                     "filemgr.getTopNProducts", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -660,10 +660,10 @@ public class XmlRpcFileManagerClient {
                 .getXmlRpcProductType(type);
         argList.add(productTypeHash);
 
-        Vector<Hashtable<String, Object>> topNProducts;
+        Vector<Map<String, Object>> topNProducts;
 
         try {
-            topNProducts = (Vector<Hashtable<String, Object>>) client.execute(
+            topNProducts = (Vector<Map<String, Object>>) client.execute(
                     "filemgr.getTopNProducts", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -869,10 +869,10 @@ public class XmlRpcFileManagerClient {
                 .getXmlRpcProductType(type);
         argList.add(productTypeHash);
 
-        Vector<Hashtable<String, Object>> productVector;
+        Vector<Map<String, Object>> productVector;
 
         try {
-            productVector = (Vector<Hashtable<String, Object>>) client.execute(
+            productVector = (Vector<Map<String, Object>>) client.execute(
                     "filemgr.getProductsByProductType", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -896,10 +896,10 @@ public class XmlRpcFileManagerClient {
 
         argList.add(productTypeHash);
 
-        Vector<Hashtable<String, Object>> elementVector;
+        Vector<Map<String, Object>> elementVector;
 
         try {
-            elementVector = (Vector<Hashtable<String, Object>>) client.execute(
+            elementVector = (Vector<Map<String, Object>>) client.execute(
                     "filemgr.getElementsByProductType", argList);
         } catch (XmlRpcException e) {
             throw new ValidationLayerException(e);
@@ -990,12 +990,12 @@ public class XmlRpcFileManagerClient {
     public List<QueryResult> complexQuery(ComplexQuery complexQuery)
             throws CatalogException {
         try {
-            Hashtable<String, Object> complexQueryHash = XmlRpcStructFactory
+            Map<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
+            Vector<Map<String, Object>> queryResultHashVector = (Vector<Map<String, Object>>) client
                     .execute("filemgr.complexQuery", argList);
             return XmlRpcStructFactory
                     .getQueryResultsFromXmlRpc(queryResultHashVector);
@@ -1016,10 +1016,10 @@ public class XmlRpcFileManagerClient {
         argList.add(queryHash);
         argList.add(typeHash);
 
-        Vector<Hashtable<String, Object>> productVector;
+        Vector<Map<String, Object>> productVector;
 
         try {
-            productVector = (Vector<Hashtable<String, Object>>) client.execute(
+            productVector = (Vector<Map<String, Object>>) client.execute(
                     "filemgr.query", argList);
         } catch (XmlRpcException e) {
             LOG.log(Level.SEVERE, e.getMessage());
@@ -1114,13 +1114,13 @@ public class XmlRpcFileManagerClient {
             throws CatalogException {
         Vector<Object> argList = new Vector<Object>();
 
-        Vector<Hashtable<String, Object>> productReferenceVector;
-        Hashtable<String, Object> productHash = XmlRpcStructFactory
+        Vector<Map<String, Object>> productReferenceVector;
+        Map<String, Object> productHash = XmlRpcStructFactory
                 .getXmlRpcProduct(product);
         argList.add(productHash);
 
         try {
-            productReferenceVector = (Vector<Hashtable<String, Object>>) client
+            productReferenceVector = (Vector<Map<String, Object>>) client
                     .execute("filemgr.getProductReferences", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -1140,11 +1140,11 @@ public class XmlRpcFileManagerClient {
     public Product getProductById(String productId) throws CatalogException {
         Vector<Object> argList = new Vector<Object>();
 
-        Hashtable<String, Object> productHash;
+        Map<String, Object> productHash;
         argList.add(productId);
 
         try {
-            productHash = (Hashtable<String, Object>) client.execute(
+            productHash = (Map<String, Object>) client.execute(
                     "filemgr.getProductById", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -1163,11 +1163,11 @@ public class XmlRpcFileManagerClient {
     public Product getProductByName(String productName) throws CatalogException {
         Vector<Object> argList = new Vector<Object>();
 
-        Hashtable<String, Object> productHash;
+        Map<String, Object> productHash;
         argList.add(productName);
 
         try {
-            productHash = (Hashtable<String, Object>) client.execute(
+            productHash = (Map<String, Object>) client.execute(
                     "filemgr.getProductByName", argList);
         } catch (XmlRpcException e) {
             throw new CatalogException(e);
@@ -1187,7 +1187,7 @@ public class XmlRpcFileManagerClient {
         try {
             // ingest product
             Vector<Object> argList = new Vector<Object>();
-            Hashtable<String, Object> productHash = XmlRpcStructFactory
+            Map<String, Object> productHash = XmlRpcStructFactory
                     .getXmlRpcProduct(product);
             argList.add(productHash);
             argList.add(metadata.getHashTable());

http://git-wip-us.apache.org/repos/asf/oodt/blob/3e0e5972/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
----------------------------------------------------------------------
diff --git a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
index a7b4964..d10ef2a 100644
--- a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
+++ b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/util/XmlRpcStructFactory.java
@@ -67,7 +67,7 @@ public final class XmlRpcStructFactory {
 
     public static Map<String, Object> getXmlRpcFileTransferStatus(
             FileTransferStatus status) {
-        Map<String, Object> statusHash = new ConcurrentHashMap<String, Object>();
+        Map<String, Object> statusHash = new Hashtable<String, Object>();
         statusHash.put("bytesTransferred",Long.toString(status
                 .getBytesTransferred()));
         statusHash.put("parentProduct", getXmlRpcProduct(status
@@ -113,7 +113,7 @@ public final class XmlRpcStructFactory {
         return statuses;
     }
 
-    public static Hashtable<String, Object> getXmlRpcProductPage(ProductPage page) {
+    public static Map<String, Object> getXmlRpcProductPage(ProductPage page) {
         Hashtable<String, Object>productPageHash = new Hashtable<String, Object>();
         productPageHash.put("totalPages", page.getTotalPages());
         productPageHash.put("pageNum", page.getPageNum());
@@ -123,16 +123,6 @@ public final class XmlRpcStructFactory {
         return productPageHash;
     }
 
-    public static Map<String, Object> getXmlRpcProductPageMap(ProductPage page) {
-        Map<String, Object>productPageHash = new ConcurrentHashMap<String, Object>();
-        productPageHash.put("totalPages", page.getTotalPages());
-        productPageHash.put("pageNum", page.getPageNum());
-        productPageHash.put("pageSize", page.getPageSize());
-        productPageHash.put("pageProducts", getXmlRpcProductList(page
-                .getPageProducts()));
-        return productPageHash;
-    }
-
     @SuppressWarnings("unchecked")
     public static ProductPage getProductPageFromXmlRpc(Map<String, Object> productPageHash) {
         ProductPage page = new ProductPage();
@@ -140,36 +130,12 @@ public final class XmlRpcStructFactory {
         page
                 .setPageSize((Integer) productPageHash.get("pageSize"));
         page.setTotalPages((Integer) productPageHash.get("totalPages"));
-        page.setPageProducts(getProductListFromXmlRpc((Vector<Hashtable<String, Object>>) productPageHash
+        page.setPageProducts(getProductListFromXmlRpc((Vector<Map<String, Object>>) productPageHash
                 .get("pageProducts")));
         return page;
     }
 
-    public static Hashtable<String, Object> getXmlRpcComplexQuery(ComplexQuery complexQuery) {
-        Hashtable<String, Object> complexQueryHash = getXmlRpcQuery(complexQuery);
-        if (complexQuery.getReducedProductTypeNames() != null) {
-            complexQueryHash
-                .put("reducedProductTypeNames", new Vector<String>(complexQuery.getReducedProductTypeNames()));
-        } else {
-            complexQueryHash.put("reducedProductTypeNames", new Vector<String>());
-        }
-        if (complexQuery.getReducedMetadata() != null) {
-            complexQueryHash.put("reducedMetadata", new Vector<String>(complexQuery.getReducedMetadata()));
-        } else {
-            complexQueryHash.put("reducedMetadata", new Vector<String>());
-        }
-        if (complexQuery.getSortByMetKey() != null) {
-            complexQueryHash.put("sortByMetKey", complexQuery.getSortByMetKey());
-        }
-        if (complexQuery.getToStringResultFormat() != null) {
-            complexQueryHash.put("toStringResultFormat", complexQuery.getToStringResultFormat());
-        }
-        if (complexQuery.getQueryFilter() != null) {
-            complexQueryHash.put("queryFilter", getXmlRpcQueryFilter(complexQuery.getQueryFilter()));
-        }
-        return complexQueryHash;
-    }
-    public static Map<String, Object> getXmlRpcComplexQueryMap(ComplexQuery complexQuery) {
+    public static Map<String, Object> getXmlRpcComplexQuery(ComplexQuery complexQuery) {
         Map<String, Object> complexQueryHash = getXmlRpcQuery(complexQuery);
         if (complexQuery.getReducedProductTypeNames() != null) {
             complexQueryHash
@@ -193,8 +159,9 @@ public final class XmlRpcStructFactory {
         }
         return complexQueryHash;
     }
+
     @SuppressWarnings("unchecked")
-    public static ComplexQuery getComplexQueryFromXmlRpc(Hashtable<String, Object> complexQueryHash) {
+    public static ComplexQuery getComplexQueryFromXmlRpc(Map<String, Object> complexQueryHash) {
         ComplexQuery complexQuery = new ComplexQuery();
         complexQuery.setCriteria(getQueryFromXmlRpc(complexQueryHash).getCriteria());
         if (((Vector<String>) complexQueryHash.get("reducedProductTypeNames")).size() > 0) {
@@ -265,8 +232,8 @@ public final class XmlRpcStructFactory {
         return filterAlgor;
     }
     
-    public static Vector<Hashtable<String, Object>> getXmlRpcQueryResults(List<QueryResult> queryResults) {
-        Vector<Hashtable<String, Object>> queryResultHashVector = new Vector<Hashtable<String, Object>>();
+    public static Vector<Map<String, Object>> getXmlRpcQueryResults(List<QueryResult> queryResults) {
+        Vector<Map<String, Object>> queryResultHashVector = new Vector<Map<String, Object>>();
         for (QueryResult queryResult : queryResults) {
             queryResultHashVector.add(getXmlRpcQueryResult(queryResult));
         }
@@ -281,9 +248,9 @@ public final class XmlRpcStructFactory {
         return queryResultHashVector;
     }
 
-    public static List<QueryResult> getQueryResultsFromXmlRpc(Vector<Hashtable<String, Object>> queryResultHashVector) {
+    public static List<QueryResult> getQueryResultsFromXmlRpc(Vector<Map<String, Object>> queryResultHashVector) {
         List<QueryResult> queryResults = new Vector<QueryResult>();
-        for (Hashtable<String, Object> queryResultHash : queryResultHashVector) {
+        for (Map<String, Object> queryResultHash : queryResultHashVector) {
             queryResults.add(getQueryResultFromXmlRpc(queryResultHash));
         }
         return queryResults;
@@ -297,28 +264,20 @@ public final class XmlRpcStructFactory {
         }
         return queryResults;
     }
-    public static Hashtable<String, Object> getXmlRpcQueryResult(QueryResult queryResult) {
+    public static Map<String, Object> getXmlRpcQueryResult(QueryResult queryResult) {
         Hashtable<String, Object> queryResultHash = new Hashtable<String, Object>();
         if (queryResult.getToStringFormat() != null) {
             queryResultHash.put("toStringFormat", queryResult.getToStringFormat());
         }
         queryResultHash.put("product", getXmlRpcProduct(queryResult.getProduct()));
-        queryResultHash.put("metadata", queryResult.getMetadata().getMap());
-        return queryResultHash;
-    }
-    public static Map<String, Object> getXmlRpcQueryResultMap(QueryResult queryResult) {
-        Map<String, Object> queryResultHash = new ConcurrentHashMap<String, Object>();
-        if (queryResult.getToStringFormat() != null) {
-            queryResultHash.put("toStringFormat", queryResult.getToStringFormat());
-        }
-        queryResultHash.put("product", getXmlRpcProduct(queryResult.getProduct()));
-        queryResultHash.put("metadata", queryResult.getMetadata().getMap());
+        queryResultHash.put("metadata", queryResult.getMetadata().getHashTable());
         return queryResultHash;
     }
+
     
     @SuppressWarnings("unchecked")
     public static QueryResult getQueryResultFromXmlRpc(Map<String, Object> queryResultHash) {
-        Product product = getProductFromXmlRpc((Hashtable<String, Object>) queryResultHash.get("product"));
+        Product product = getProductFromXmlRpc((Map<String, Object>) queryResultHash.get("product"));
         Metadata metadata = new Metadata();
         metadata.addMetadata((Map<String, Object>) queryResultHash.get("metadata"));
         QueryResult queryResult = new QueryResult(product, metadata);
@@ -326,8 +285,8 @@ public final class XmlRpcStructFactory {
         return queryResult;
     }
     
-    public static Hashtable<String, Object> getXmlRpcProduct(Product product) {
-        Hashtable<String, Object> productHash = new Hashtable<String, Object>();
+    public static Map<String, Object> getXmlRpcProduct(Product product) {
+        Map<String, Object> productHash = new Hashtable<String, Object>();
         if (product.getProductId() != null) {
            productHash.put("id", product.getProductId());
         }
@@ -354,57 +313,33 @@ public final class XmlRpcStructFactory {
         return productHash;
     }
 
-    public static Product getProductFromXmlRpc(Map<?, ?> productHash) {
-        /*Hashtable ht = new Hashtable();
-        ht.putAll(productHash);*/
-        Product product = new Product();
-        product.setProductId((String) productHash.get("id"));
-        product.setProductName((String) productHash.get("name"));
-        if (productHash.get("type") != null) {
-            product.setProductType(getProductTypeFromXmlRpc(
-                (Hashtable<String, Object>) productHash.get("type")));
-        }
-        product.setProductStructure((String) productHash.get("structure"));
-        product.setTransferStatus((String) productHash.get("transferStatus"));
-        if (productHash.get("references") != null) {
-            product.setProductReferences(getReferencesFromXmlRpc(
-                (Vector<Hashtable<String, Object>>) productHash
-                    .get("references")));
-        }
-        if (productHash.get("rootReference") != null) {
-            product.setRootRef(getReferenceFromXmlRpc(
-                (Hashtable<String, Object>) productHash.get("rootReference")));
-        }
-        return product;
-    }
-
     @SuppressWarnings("unchecked")
-    public static Product getProductFromXmlRpc(Hashtable<?, ?> productHash) {
+    public static Product getProductFromXmlRpc(Map<?, ?> productHash) {
         Product product = new Product();
         product.setProductId((String) productHash.get("id"));
         product.setProductName((String) productHash.get("name"));
         if (productHash.get("type") != null) {
            product.setProductType(getProductTypeFromXmlRpc(
-                 (Hashtable<String, Object>) productHash.get("type")));
+                 (Map<String, Object>) productHash.get("type")));
         }
         product.setProductStructure((String) productHash.get("structure"));
         product.setTransferStatus((String) productHash.get("transferStatus"));
         if (productHash.get("references") != null) {
            product.setProductReferences(getReferencesFromXmlRpc(
-                 (Vector<Hashtable<String, Object>>) productHash
+                 (Vector<Map<String, Object>>) productHash
                         .get("references")));
         }
         if (productHash.get("rootReference") != null) {
            product.setRootRef(getReferenceFromXmlRpc(
-                 (Hashtable<String, Object>) productHash.get("rootReference")));
+                 (Map<String, Object>) productHash.get("rootReference")));
         }
         return product;
     }
 
-    public static List<Product> getProductListFromXmlRpc(Vector<Hashtable<String, Object>> productVector) {
+    public static List<Product> getProductListFromXmlRpc(Vector<Map<String, Object>> productVector) {
         List<Product> productList = new Vector<Product>();
 
-        for (Hashtable<String, Object> productHash : productVector) {
+        for (Map<String, Object> productHash : productVector) {
             Product product = getProductFromXmlRpc(productHash);
             productList.add(product);
         }
@@ -427,15 +362,15 @@ public final class XmlRpcStructFactory {
         return productVector;
     }
 
-    public static Vector<Hashtable<String, Object>> getXmlRpcProductList(List<Product> products) {
-        Vector<Hashtable<String, Object>> productVector = new Vector<Hashtable<String, Object>>();
+    public static Vector<Map<String, Object>> getXmlRpcProductList(List<Product> products) {
+        Vector<Map<String, Object>> productVector = new Vector<Map<String, Object>>();
 
         if (products == null) {
             return productVector;
         }
 
         for (Product product : products) {
-            Hashtable<String, Object> productHash = getXmlRpcProduct(product);
+            Map<String, Object> productHash = getXmlRpcProduct(product);
             productVector.add(productHash);
         }
 
@@ -466,36 +401,8 @@ public final class XmlRpcStructFactory {
         return productTypeList;
     }
 
-    public static Map<String, Object> getXmlRpcProductTypeMap(ProductType type) {
-        Map<String, Object> productTypeHash = new ConcurrentHashMap<String, Object>();
-        // TODO(bfoster): ProductType ID is currently required by XmlRpcFileManager.
-        productTypeHash.put("id", type.getProductTypeId());
-        if (type.getName() != null) {
-           productTypeHash.put("name", type.getName());
-        }
-        if (type.getDescription() != null) {
-           productTypeHash.put("description", type.getDescription());  
-        }
-        if (type.getProductRepositoryPath() != null) {
-           productTypeHash.put("repositoryPath",type.getProductRepositoryPath());
-        }
-        if (type.getVersioner() != null) {
-           productTypeHash.put("versionerClass", type.getVersioner());
-        }
-        if (type.getTypeMetadata() != null) {
-           productTypeHash.put("typeMetadata", type.getTypeMetadata().getMap());
-        }
-        if (type.getExtractors() != null) {
-           productTypeHash.put("typeExtractors", getXmlRpcTypeExtractors(type.getExtractors()));
-        }
-        if (type.getHandlers() != null) {
-           productTypeHash.put("typeHandlers", getXmlRpcTypeHandlers(type.getHandlers()));
-        }
-        return productTypeHash;
-    }
-
-    public static Hashtable<String, Object> getXmlRpcProductType(ProductType type) {
-        Hashtable<String, Object> productTypeHash = new Hashtable<String, Object>();
+    public static Map<String, Object> getXmlRpcProductType(ProductType type) {
+        Map<String, Object> productTypeHash = new Hashtable<String, Object>();
         // TODO(bfoster): ProductType ID is currently required by XmlRpcFileManager.
         productTypeHash.put("id", type.getProductTypeId());
         if (type.getName() != null) {
@@ -537,19 +444,19 @@ public final class XmlRpcStructFactory {
         }
         if (productTypeHash.get("typeExtractors") != null) {
             type.setExtractors(getTypeExtractorsFromXmlRpc(
-                  (Vector<Hashtable<String, Object>>) productTypeHash
+                  (Vector<Map<String, Object>>) productTypeHash
                      .get("typeExtractors")));
         }
         if (productTypeHash.get("typeHandlers") != null) {
             type.setHandlers(getTypeHandlersFromXmlRpc(
-                  (Vector<Hashtable<String, Object>>) productTypeHash
+                  (Vector<Map<String, Object>>) productTypeHash
                         .get("typeHandlers")));
         }
         return type;
     }
 
-    public static Vector<Hashtable<String, Object>> getXmlRpcTypeExtractors(List<ExtractorSpec> extractors) {
-        Vector<Hashtable<String, Object>> extractorsVector = new Vector<Hashtable<String, Object>>();
+    public static Vector<Map<String, Object>> getXmlRpcTypeExtractors(List<ExtractorSpec> extractors) {
+        Vector<Map<String, Object>> extractorsVector = new Vector<Map<String, Object>>();
 
         if (extractors != null && extractors.size() > 0) {
             for (ExtractorSpec spec : extractors) {
@@ -571,26 +478,15 @@ public final class XmlRpcStructFactory {
         return extractorsVector;
     }
 
-    public static Hashtable<String, Object> getXmlRpcExtractorSpec(ExtractorSpec spec) {
-        Hashtable<String, Object> extractorHash = new Hashtable<String, Object>();
+    public static Map<String, Object> getXmlRpcExtractorSpec(ExtractorSpec spec) {
+        Map<String, Object> extractorHash = new Hashtable<String, Object>();
         extractorHash.put("className", spec.getClassName());
         extractorHash.put("config",
                 getXmlRpcProperties(spec.getConfiguration()));
         return extractorHash;
     }
 
-    public static Vector<Hashtable<String, Object>> getXmlRpcTypeHandlers(List<TypeHandler> typeHandlers) {
-        Vector<Hashtable<String, Object>> handlersVector = new Vector<Hashtable<String, Object>>();
-
-        if (typeHandlers != null && typeHandlers.size() > 0) {
-            for (TypeHandler typeHandler : typeHandlers) {
-                handlersVector.add(getXmlRpcTypeHandler(typeHandler));
-            }
-        }
-
-        return handlersVector;
-    }
-    public static Vector<Map<String, Object>> getXmlRpcTypeHandlersMap(List<TypeHandler> typeHandlers) {
+    public static Vector<Map<String, Object>> getXmlRpcTypeHandlers(List<TypeHandler> typeHandlers) {
         Vector<Map<String, Object>> handlersVector = new Vector<Map<String, Object>>();
 
         if (typeHandlers != null && typeHandlers.size() > 0) {
@@ -602,8 +498,8 @@ public final class XmlRpcStructFactory {
         return handlersVector;
     }
 
-    public static Hashtable<String, Object> getXmlRpcTypeHandler(TypeHandler typeHandler) {
-        Hashtable<String, Object> handlerHash = new Hashtable<String, Object>();
+    public static Map<String, Object> getXmlRpcTypeHandler(TypeHandler typeHandler) {
+        Map<String, Object> handlerHash = new Hashtable<String, Object>();
         handlerHash.put("className", typeHandler != null ?
                                      typeHandler.getClass().getCanonicalName():"");
         handlerHash.put("elementName", typeHandler != null ?
@@ -611,20 +507,11 @@ public final class XmlRpcStructFactory {
         return handlerHash;
     }
 
-    public static Map<String, Object> getXmlRpcTypeHandlerMap(TypeHandler typeHandler) {
-        Map<String, Object> handlerHash = new ConcurrentHashMap<String, Object>();
-        handlerHash.put("className", typeHandler != null ? 
-            typeHandler.getClass().getCanonicalName():"");
-        handlerHash.put("elementName", typeHandler != null ? 
-            typeHandler.getElementName():"");
-        return handlerHash;
-    }
-
-    public static List<ExtractorSpec> getTypeExtractorsFromXmlRpc(Vector<Hashtable<String, Object>> extractorsVector) {
+    public static List<ExtractorSpec> getTypeExtractorsFromXmlRpc(Vector<Map<String, Object>> extractorsVector) {
         List<ExtractorSpec> extractors = new Vector<ExtractorSpec>();
 
         if (extractorsVector != null && extractorsVector.size() > 0) {
-            for (Hashtable<String, Object> extractorSpecHash : extractorsVector) {
+            for (Map<String, Object> extractorSpecHash : extractorsVector) {
                 extractors.add(getExtractorSpecFromXmlRpc(extractorSpecHash));
             }
         }
@@ -638,16 +525,16 @@ public final class XmlRpcStructFactory {
         ExtractorSpec spec = new ExtractorSpec();
         spec.setClassName((String) extractorSpecHash.get("className"));
         spec
-                .setConfiguration(getPropertiesFromXmlRpc((Hashtable<String, String>) extractorSpecHash
+                .setConfiguration(getPropertiesFromXmlRpc((Map<String, String>) extractorSpecHash
                         .get("config")));
         return spec;
     }
     
-    public static List<TypeHandler> getTypeHandlersFromXmlRpc(Vector<Hashtable<String, Object>> handlersVector) {
+    public static List<TypeHandler> getTypeHandlersFromXmlRpc(Vector<Map<String, Object>> handlersVector) {
         List<TypeHandler> handlers = new Vector<TypeHandler>();
 
         if (handlersVector != null && handlersVector.size() > 0) {
-            for (Hashtable<String, Object> typeHandlerHash : handlersVector) {
+            for (Map<String, Object> typeHandlerHash : handlersVector) {
                 handlers.add(getTypeHandlerFromXmlRpc(typeHandlerHash));
             }
         }
@@ -656,7 +543,7 @@ public final class XmlRpcStructFactory {
     }
     
     public static TypeHandler getTypeHandlerFromXmlRpc(
-            Hashtable<String, Object> typeHandlerHash) {
+            Map<String, Object> typeHandlerHash) {
         TypeHandler typeHandler = GenericFileManagerObjectFactory
             .getTypeHandlerFromClassName((String) typeHandlerHash.get("className"));
         if(typeHandler != null) {
@@ -678,8 +565,8 @@ public final class XmlRpcStructFactory {
         return props;
     }
 
-    public static Hashtable<String, String> getXmlRpcProperties(Properties props) {
-        Hashtable<String, String> propHash = new Hashtable<String, String>();
+    public static Map<String, String> getXmlRpcProperties(Properties props) {
+        Map<String, String> propHash = new Hashtable<String, String>();
 
         if (props != null && props.keySet().size() > 0) {
             for (Object o : props.keySet()) {
@@ -707,31 +594,31 @@ public final class XmlRpcStructFactory {
         return refVector;
     }
 
-    public static Vector<Hashtable<String, Object>> getXmlRpcReferences(List<Reference> references) {
-        Vector<Hashtable<String, Object>> refVector = new Vector<Hashtable<String, Object>>();
+    public static Vector<Map<String, Object>> getXmlRpcReferences(List<Reference> references) {
+        Vector<Map<String, Object>> refVector = new Vector<Map<String, Object>>();
 
         if (references == null) {
             return refVector;
         }
 
         for (Reference reference : references) {
-            Hashtable<String, Object> refHash = getXmlRpcReference(reference);
+            Map<String, Object> refHash = getXmlRpcReference(reference);
             refVector.add(refHash);
         }
 
         return refVector;
     }
-    public static List<Reference> getReferencesFromXmlRpc(Vector<Hashtable<String, Object>> referenceVector) {
+    public static List<Reference> getReferencesFromXmlRpc(Vector<Map<String, Object>> referenceVector) {
         List<Reference> references = new Vector<Reference>();
-        for (Hashtable<String, Object> aReferenceVector : referenceVector) {
+        for (Map<String, Object> aReferenceVector : referenceVector) {
             Reference r = getReferenceFromXmlRpc(aReferenceVector);
             references.add(r);
         }
         return references;
     }
 
-    public static Hashtable<String, Object> getXmlRpcReference(Reference reference) {
-        Hashtable<String, Object> referenceHash = new Hashtable<String, Object>();
+    public static Map<String, Object> getXmlRpcReference(Reference reference) {
+        Map<String, Object> referenceHash = new Hashtable<String, Object>();
         referenceHash.put("origReference", reference.getOrigReference());
         referenceHash.put("dataStoreReference", reference
                 .getDataStoreReference() != null ? reference
@@ -753,7 +640,7 @@ public final class XmlRpcStructFactory {
         return reference;
     }
 
-    public static Reference getReferenceFromXmlRpcHashtable(Hashtable<String, Object> referenceHash) {
+    public static Reference getReferenceFromXmlRpcHashtable(Map<String, Object> referenceHash) {
         Reference reference = new Reference();
         reference.setDataStoreReference((String) referenceHash
             .get("dataStoreReference"));
@@ -763,10 +650,10 @@ public final class XmlRpcStructFactory {
         return reference;
     }
 
-    public static Vector<Hashtable<String, Object>> getXmlRpcElementListHashtable(List<Element> elementList) {
-        Vector<Hashtable<String, Object>> elementVector = new Vector<Hashtable<String, Object>>(elementList.size());
+    public static Vector<Map<String, Object>> getXmlRpcElementListHashtable(List<Element> elementList) {
+        Vector<Map<String, Object>> elementVector = new Vector<Map<String, Object>>(elementList.size());
         for (Element element : elementList) {
-            Hashtable<String, Object> elementHash = getXmlRpcElementHashTable(element);
+            Map<String, Object> elementHash = getXmlRpcElementHashTable(element);
             elementVector.add(elementHash);
         }
         return elementVector;
@@ -775,23 +662,23 @@ public final class XmlRpcStructFactory {
     public static Vector<Map<String, Object>> getXmlRpcElementList(List<Element> elementList) {
         Vector<Map<String, Object>> elementVector = new Vector<Map<String, Object>>(elementList.size());
         for (Element element : elementList) {
-            HashMap<String, Object> elementHash = getXmlRpcElement(element);
+            Map<String, Object> elementHash = getXmlRpcElement(element);
             elementVector.add(elementHash);
         }
         return elementVector;
     }
 
-    public static List<Element> getElementListFromXmlRpc(Vector<Hashtable<String, Object>> elementVector) {
+    public static List<Element> getElementListFromXmlRpc(Vector<Map<String, Object>> elementVector) {
         List<Element> elementList = new Vector<Element>(elementVector.size());
-        for (Hashtable<String, Object> elementHash : elementVector) {
+        for (Map<String, Object> elementHash : elementVector) {
             Element element = getElementFromXmlRpc(elementHash);
             elementList.add(element);
         }
         return elementList;
     }
 
-    public static HashMap<String, Object> getXmlRpcElement(Element element) {
-        HashMap<String, Object> elementHash = new HashMap<String, Object>();
+    public static Map<String, Object> getXmlRpcElement(Element element) {
+        Map<String, Object> elementHash = new HashMap<String, Object>();
 
         elementHash.put("id", element.getElementId());
         elementHash.put("name", element.getElementName());
@@ -803,8 +690,8 @@ public final class XmlRpcStructFactory {
 
         return elementHash;
     }
-    public static Hashtable<String, Object> getXmlRpcElementHashTable(Element element) {
-        Hashtable<String, Object> elementHash = new Hashtable<String, Object>();
+    public static Map<String, Object> getXmlRpcElementHashTable(Element element) {
+        Map<String, Object> elementHash = new Hashtable<String, Object>();
 
         elementHash.put("id", element.getElementId());
         elementHash.put("name", element.getElementName());
@@ -816,7 +703,7 @@ public final class XmlRpcStructFactory {
 
         return elementHash;
     }
-    public static Element getElementFromXmlRpc(Hashtable<String, Object> elementHash) {
+    public static Element getElementFromXmlRpc(Map<String, Object> elementHash) {
         Element element = new Element();
         element.setElementId((String) elementHash.get("id"));
         element.setElementName((String) elementHash.get("name"));
@@ -826,14 +713,14 @@ public final class XmlRpcStructFactory {
         return element;
     }
 
-    public static Hashtable<String, Object> getXmlRpcQuery(Query query) {
-        Hashtable<String, Object> queryHash = new Hashtable<String, Object>();
-        Vector<Hashtable<String, Object>> criteriaVector = getXmlRpcQueryCriteriaList(query.getCriteria());
+    public static Map<String, Object> getXmlRpcQuery(Query query) {
+        Map<String, Object> queryHash = new Hashtable<String, Object>();
+        Vector<Map<String, Object>> criteriaVector = getXmlRpcQueryCriteriaList(query.getCriteria());
         queryHash.put("criteria", criteriaVector);
         return queryHash;
     }
 
-    public static Query getQueryFromXmlRpc(Hashtable<String, Object> queryHash) {
+    public static Query getQueryFromXmlRpc(Map<String, Object> queryHash) {
         Query query = new Query();
         @SuppressWarnings("unchecked")
         List<QueryCriteria> criteria = getQueryCriteriaListFromXmlRpc((Vector<Map<String, Object>>) queryHash
@@ -851,10 +738,10 @@ public final class XmlRpcStructFactory {
         return query;
     }
 
-    public static Vector<Hashtable<String, Object>> getXmlRpcQueryCriteriaList(List<QueryCriteria> criteriaList) {
-        Vector<Hashtable<String, Object>> criteriaVector = new Vector<Hashtable<String, Object>>(criteriaList.size());
+    public static Vector<Map<String, Object>> getXmlRpcQueryCriteriaList(List<QueryCriteria> criteriaList) {
+        Vector<Map<String, Object>> criteriaVector = new Vector<Map<String, Object>>(criteriaList.size());
         for (QueryCriteria criteria : criteriaList) {
-            Hashtable<String, Object> criteriaHash = getXmlRpcQueryCriteria(criteria);
+            Map<String, Object> criteriaHash = getXmlRpcQueryCriteria(criteria);
             criteriaVector.add(criteriaHash);
         }
 
@@ -871,8 +758,8 @@ public final class XmlRpcStructFactory {
         return criteriaList;
     }
 
-    public static Hashtable<String, Object> getXmlRpcQueryCriteria(QueryCriteria criteria) {
-        Hashtable<String, Object> criteriaHash = new Hashtable<String, Object>();
+    public static Map<String, Object> getXmlRpcQueryCriteria(QueryCriteria criteria) {
+        Map<String, Object> criteriaHash = new Hashtable<String, Object>();
         criteriaHash.put("class",criteria.getClass().getCanonicalName());
         
         if(criteria instanceof TermQueryCriteria){  
@@ -888,11 +775,11 @@ public final class XmlRpcStructFactory {
         } else if(criteria instanceof BooleanQueryCriteria){
             BooleanQueryCriteria boolQuery = (BooleanQueryCriteria) criteria;
             criteriaHash.put("operator", boolQuery.getOperator());
-            Vector<Hashtable<String, Object>> termsHash = new Vector<Hashtable<String, Object>>();
+            Vector<Map<String, Object>> termsHash = new Vector<Map<String, Object>>();
             List<QueryCriteria> terms = boolQuery.getTerms();
 
             for (QueryCriteria term : terms) {
-                Hashtable<String, Object> termHash = getXmlRpcQueryCriteria(term);
+                Map<String, Object> termHash = getXmlRpcQueryCriteria(term);
                 termsHash.add(termHash);
             }
             criteriaHash.put("terms", termsHash);

http://git-wip-us.apache.org/repos/asf/oodt/blob/3e0e5972/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java b/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
index 73a21dc..0f10a81 100644
--- a/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
+++ b/metadata/src/main/java/org/apache/oodt/cas/metadata/Metadata.java
@@ -15,8 +15,6 @@
 
 package org.apache.oodt.cas.metadata;
 
-//JDK imports
-
 import java.util.Collections;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.Hashtable;
@@ -486,7 +484,19 @@ public class Metadata {
     public Group(String name) {
       this.name = name;
       this.values = new Vector<String>();
-      this.children = new ConcurrentHashMap<String, Group>();
+      this.children = new Hashtable<String, Group>();
+    }
+
+    public Group(String name, boolean legacy) {
+      this.name = name;
+      this.values = new Vector<String>();
+      if(legacy){
+        this.children = new Hashtable<String, Group>();
+      }
+      else{
+        this.children = new ConcurrentHashMap<String, Group>();
+      }
+
     }
 
     public String getName() {


[5/6] oodt git commit: OODT-917 alter XMLRPC interface to support more generic map types where suitable

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/oodt/blob/8705ccf4/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
----------------------------------------------------------------------
diff --git a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
index e5ad57b..8c78434 100644
--- a/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
+++ b/filemgr/src/main/java/org/apache/oodt/cas/filemgr/system/XmlRpcFileManager.java
@@ -56,7 +56,6 @@ import org.apache.xmlrpc.WebServer;
 
 import com.google.common.collect.Lists;
 
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -80,206 +79,205 @@ import java.util.logging.Logger;
  * @author mattmann
  * @author bfoster
  * @version $Revision$
- * 
- * <p>
- * An XML RPC-based File manager.
- * </p>
- * 
+ *          <p/>
+ *          <p> An XML RPC-based File manager. </p>
  */
 public class XmlRpcFileManager {
 
-    /* the port to run the XML RPC web server on, default is 1999 */
-    private int webServerPort = 1999;
-
-    /* our Catalog */
-    private Catalog catalog = null;
-
-    /* our RepositoryManager */
-    private RepositoryManager repositoryManager = null;
-
-    /* our DataTransfer */
-    private DataTransfer dataTransfer = null;
-
-    /* our log stream */
-    private static final Logger LOG = Logger.getLogger(XmlRpcFileManager.class.getName());
-
-    /* our xml rpc web server */
-    private WebServer webServer = null;
-
-    /* our data transfer status tracker */
-    private TransferStatusTracker transferStatusTracker = null;
-    
-    /* whether or not to expand a product instance into met */
-    private boolean expandProductMet;
-    
-    /**
-     * <p>
-     * Creates a new XmlRpcFileManager with the given metadata store factory,
-     * and the given data store factory, on the given port.
-     * </p>
-     * 
-     * @param port
-     *            The web server port to run the XML Rpc server on, defaults to
-     *            1999.
-     */
-    public XmlRpcFileManager(int port) throws IOException {
-        webServerPort = port;
-
-        // start up the web server
-        webServer = new WebServer(webServerPort);
-        webServer.addHandler("filemgr", this);
-        webServer.start();
-
-        this.loadConfiguration();
-        LOG.log(Level.INFO, "File Manager started by "
-                + System.getProperty("user.name", "unknown"));
+  /* the port to run the XML RPC web server on, default is 1999 */
+  private int webServerPort = 1999;
 
-    }
-    
-    public void setCatalog(Catalog catalog) {
-        this.catalog = catalog;
-    }
+  /* our Catalog */
+  private Catalog catalog = null;
 
-    public boolean isAlive() {
-        return true;
-    }
-    
-    public boolean refreshConfigAndPolicy() {
-      boolean status = false;
+  /* our RepositoryManager */
+  private RepositoryManager repositoryManager = null;
 
-      try {
-        this.loadConfiguration();
-        status = true;
-      } catch (Exception e) {
-        LOG.log(Level.SEVERE, e.getMessage());
-        LOG
-            .log(
-                Level.SEVERE,
-                "Unable to refresh configuration for file manager " +
-                "server: server may be in inoperable state: Message: "
-                    + e.getMessage());
-      }
-  
-      return status;
+  /* our DataTransfer */
+  private DataTransfer dataTransfer = null;
+
+  /* our log stream */
+  private static final Logger LOG = Logger.getLogger(XmlRpcFileManager.class.getName());
+
+  /* our xml rpc web server */
+  private WebServer webServer = null;
+
+  /* our data transfer status tracker */
+  private TransferStatusTracker transferStatusTracker = null;
+
+  /* whether or not to expand a product instance into met */
+  private boolean expandProductMet;
+
+  /**
+   * <p> Creates a new XmlRpcFileManager with the given metadata store factory, and the given data store factory, on the
+   * given port. </p>
+   *
+   * @param port The web server port to run the XML Rpc server on, defaults to 1999.
+   */
+  public XmlRpcFileManager(int port) throws IOException {
+    webServerPort = port;
+
+    // start up the web server
+    webServer = new WebServer(webServerPort);
+    webServer.addHandler("filemgr", this);
+    webServer.start();
+
+    this.loadConfiguration();
+    LOG.log(Level.INFO, "File Manager started by "
+                        + System.getProperty("user.name", "unknown"));
+
+  }
+
+  public void setCatalog(Catalog catalog) {
+    this.catalog = catalog;
+  }
+
+  public boolean isAlive() {
+    return true;
+  }
+
+  public boolean refreshConfigAndPolicy() {
+    boolean status = false;
+
+    try {
+      this.loadConfiguration();
+      status = true;
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG
+          .log(
+              Level.SEVERE,
+              "Unable to refresh configuration for file manager " +
+              "server: server may be in inoperable state: Message: "
+              + e.getMessage());
     }
 
+    return status;
+  }
+
   public boolean transferringProduct(Hashtable<String, Object> productHash) {
     return this.transferringProductCore(productHash);
   }
 
   public boolean transferringProductCore(Map<String, Object> productHash) {
-        Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        transferStatusTracker.transferringProduct(p);
-        return true;
-    }
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    transferStatusTracker.transferringProduct(p);
+    return true;
+  }
 
-    public Map<String, Object> getCurrentFileTransferCore() {
-        FileTransferStatus status = transferStatusTracker
-                .getCurrentFileTransfer();
-        if (status == null) {
-            return new ConcurrentHashMap<String, Object>();
-        } else {
-          return XmlRpcStructFactory.getXmlRpcFileTransferStatus(status);
-        }
+  public Map<String, Object> getCurrentFileTransferCore() {
+    FileTransferStatus status = transferStatusTracker
+        .getCurrentFileTransfer();
+    if (status == null) {
+      return new ConcurrentHashMap<String, Object>();
+    } else {
+      return XmlRpcStructFactory.getXmlRpcFileTransferStatus(status);
     }
+  }
 
-    public List<Map<String, Object>> getCurrentFileTransfers() {
-        List<FileTransferStatus> currentTransfers = transferStatusTracker.getCurrentFileTransfers();
+  public List<Map<String, Object>> getCurrentFileTransfers() {
+    List<FileTransferStatus> currentTransfers = transferStatusTracker.getCurrentFileTransfers();
 
-        if (currentTransfers != null && currentTransfers.size() > 0) {
-            return XmlRpcStructFactory
-                    .getXmlRpcFileTransferStatuses(currentTransfers);
-        } else {
-          return new Vector<Map<String, Object>>();
-        }
+    if (currentTransfers != null && currentTransfers.size() > 0) {
+      return XmlRpcStructFactory
+          .getXmlRpcFileTransferStatuses(currentTransfers);
+    } else {
+      return new Vector<Map<String, Object>>();
     }
+  }
 
   public double getProductPctTransferred(Hashtable<String, Object> productHash) {
     return this.getProductPctTransferredCore(productHash);
   }
-    public double getProductPctTransferredCore(Map<String, Object> productHash) {
-        Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-      return transferStatusTracker.getPctTransferred(product);
-    }
+
+  public double getProductPctTransferredCore(Map<String, Object> productHash) {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return transferStatusTracker.getPctTransferred(product);
+  }
 
   public double getRefPctTransferred(Hashtable<String, Object> refHash) {
     return getRefPctTransferredCore(refHash);
   }
-    public double getRefPctTransferredCore(Map<String, Object> refHash) {
-        Reference reference = XmlRpcStructFactory
-                .getReferenceFromXmlRpc(refHash);
-        double pct = 0.0;
 
-        try {
-            pct = transferStatusTracker.getPctTransferred(reference);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.WARNING,
-                    "Exception getting transfer percentage for ref: ["
-                            + reference.getOrigReference() + "]: Message: "
-                            + e.getMessage());
-        }
-        return pct;
+  public double getRefPctTransferredCore(Map<String, Object> refHash) {
+    Reference reference = XmlRpcStructFactory
+        .getReferenceFromXmlRpc(refHash);
+    double pct = 0.0;
+
+    try {
+      pct = transferStatusTracker.getPctTransferred(reference);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.WARNING,
+          "Exception getting transfer percentage for ref: ["
+          + reference.getOrigReference() + "]: Message: "
+          + e.getMessage());
     }
+    return pct;
+  }
 
   public boolean removeProductTransferStatus(Hashtable<String, Object> productHash) {
     return removeProductTransferStatusCore(productHash);
   }
-    public boolean removeProductTransferStatusCore(Map<String, Object> productHash) {
-        Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        transferStatusTracker.removeProductTransferStatus(product);
-        return true;
-    }
+
+  public boolean removeProductTransferStatusCore(Map<String, Object> productHash) {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    transferStatusTracker.removeProductTransferStatus(product);
+    return true;
+  }
+
   public boolean isTransferComplete(Hashtable<String, Object> productHash) {
     return this.isTransferCompleteCore(productHash);
   }
-    public boolean isTransferCompleteCore(Map<String, Object> productHash) {
-        Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        return transferStatusTracker.isTransferComplete(product);
-    }
+
+  public boolean isTransferCompleteCore(Map<String, Object> productHash) {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return transferStatusTracker.isTransferComplete(product);
+  }
+
   public Map<String, Object> pagedQuery(
       Hashtable<String, Object> queryHash,
       Hashtable<String, Object> productTypeHash,
       int pageNum) throws CatalogException {
-  return this.pagedQueryCore(queryHash,productTypeHash,pageNum);
+    return this.pagedQueryCore(queryHash, productTypeHash, pageNum);
   }
 
-    public Map<String, Object> pagedQueryCore(
-            Map<String, Object> queryHash,
-            Map<String, Object> productTypeHash,
-            int pageNum) throws CatalogException {
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        Query query = XmlRpcStructFactory.getQueryFromXmlRpcMap(queryHash);
-
-        ProductPage prodPage;
+  public Map<String, Object> pagedQueryCore(
+      Map<String, Object> queryHash,
+      Map<String, Object> productTypeHash,
+      int pageNum) throws CatalogException {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    Query query = XmlRpcStructFactory.getQueryFromXmlRpc(queryHash);
 
-        try {
-            prodPage = catalog.pagedQuery(this.getCatalogQuery(query, type), type, pageNum);
-
-            if (prodPage == null) {
-                prodPage = ProductPage.blankPage();
-            } else {
-                // it is possible here that the underlying catalog did not
-                // set the ProductType
-                // to obey the contract of the File Manager, we need to make
-                // sure its set here
-                setProductType(prodPage.getPageProducts());
-            }
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.WARNING,
-                    "Catalog exception performing paged query for product type: ["
-                            + type.getProductTypeId() + "] query: [" + query
-                            + "]: Message: " + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        }
+    ProductPage prodPage;
 
-        return XmlRpcStructFactory.getXmlRpcProductPage(prodPage);
+    try {
+      prodPage = catalog.pagedQuery(this.getCatalogQuery(query, type), type, pageNum);
+
+      if (prodPage == null) {
+        prodPage = ProductPage.blankPage();
+      } else {
+        // it is possible here that the underlying catalog did not
+        // set the ProductType
+        // to obey the contract of the File Manager, we need to make
+        // sure its set here
+        setProductType(prodPage.getPageProducts());
+      }
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.WARNING,
+          "Catalog exception performing paged query for product type: ["
+          + type.getProductTypeId() + "] query: [" + query
+          + "]: Message: " + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
     }
 
+    return XmlRpcStructFactory.getXmlRpcProductPage(prodPage);
+  }
+
   public Map<String, Object> getFirstPage(
-      Hashtable<String, Object> productTypeHash){
+      Hashtable<String, Object> productTypeHash) {
     return this.getFirstPageCore(productTypeHash);
   }
 
@@ -300,82 +298,86 @@ public class XmlRpcFileManager {
 
 
   public Map<String, Object> getLastPage(
-      Hashtable<String, Object> productTypeHash){
+      Hashtable<String, Object> productTypeHash) {
     return this.getLastPageCore(productTypeHash);
   }
-    public Map<String, Object> getLastPageCore(
-            Map<String, Object> productTypeHash) {
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        ProductPage page = catalog.getLastProductPage(type);
-        try {
-            setProductType(page.getPageProducts());
-        } catch (Exception e) {
-            LOG.log(Level.WARNING,
-                    "Unable to set product types for product page list: ["
-                            + page + "]");
-        }
-        return XmlRpcStructFactory.getXmlRpcProductPage(page);
+
+  public Map<String, Object> getLastPageCore(
+      Map<String, Object> productTypeHash) {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    ProductPage page = catalog.getLastProductPage(type);
+    try {
+      setProductType(page.getPageProducts());
+    } catch (Exception e) {
+      LOG.log(Level.WARNING,
+          "Unable to set product types for product page list: ["
+          + page + "]");
     }
+    return XmlRpcStructFactory.getXmlRpcProductPage(page);
+  }
 
   public Map<String, Object> getNextPage(
       Hashtable<String, Object> productTypeHash,
-      Hashtable<String, Object> currentPageHash){
+      Hashtable<String, Object> currentPageHash) {
     return this.getNextPageCore(productTypeHash, currentPageHash);
   }
-    public Map<String, Object> getNextPageCore(
-            Map<String, Object> productTypeHash,
-            Map<String, Object> currentPageHash) {
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        ProductPage currPage = XmlRpcStructFactory
-                .getProductPageFromXmlRpc(currentPageHash);
-        ProductPage page = catalog.getNextPage(type, currPage);
-        try {
-            setProductType(page.getPageProducts());
-        } catch (Exception e) {
-            LOG.log(Level.WARNING,
-                    "Unable to set product types for product page list: ["
-                            + page + "]");
-        }
-        return XmlRpcStructFactory.getXmlRpcProductPage(page);
+
+  public Map<String, Object> getNextPageCore(
+      Map<String, Object> productTypeHash,
+      Map<String, Object> currentPageHash) {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    ProductPage currPage = XmlRpcStructFactory
+        .getProductPageFromXmlRpc(currentPageHash);
+    ProductPage page = catalog.getNextPage(type, currPage);
+    try {
+      setProductType(page.getPageProducts());
+    } catch (Exception e) {
+      LOG.log(Level.WARNING,
+          "Unable to set product types for product page list: ["
+          + page + "]");
     }
+    return XmlRpcStructFactory.getXmlRpcProductPage(page);
+  }
+
   public Map<String, Object> getPrevPage(
       Hashtable<String, Object> productTypeHash,
-      Hashtable<String, Object> currentPageHash){
+      Hashtable<String, Object> currentPageHash) {
     return this.getPrevPageCore(productTypeHash, currentPageHash);
   }
+
   public Map<String, Object> getPrevPageCore(
-            Map<String, Object> productTypeHash,
-            Map<String, Object> currentPageHash) {
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        ProductPage currPage = XmlRpcStructFactory
-                .getProductPageFromXmlRpc(currentPageHash);
-        ProductPage page = catalog.getPrevPage(type, currPage);
-        try {
-            setProductType(page.getPageProducts());
-        } catch (Exception e) {
-            LOG.log(Level.WARNING,
-                    "Unable to set product types for product page list: ["
-                            + page + "]");
-        }
-        return XmlRpcStructFactory.getXmlRpcProductPage(page);
+      Map<String, Object> productTypeHash,
+      Map<String, Object> currentPageHash) {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    ProductPage currPage = XmlRpcStructFactory
+        .getProductPageFromXmlRpc(currentPageHash);
+    ProductPage page = catalog.getPrevPage(type, currPage);
+    try {
+      setProductType(page.getPageProducts());
+    } catch (Exception e) {
+      LOG.log(Level.WARNING,
+          "Unable to set product types for product page list: ["
+          + page + "]");
     }
+    return XmlRpcStructFactory.getXmlRpcProductPage(page);
+  }
 
   public String addProductType(Hashtable<String, Object> productTypeHash)
       throws RepositoryManagerException {
     return this.addProductTypeCore(productTypeHash);
   }
 
-    public String addProductTypeCore(Map<String, Object> productTypeHash)
-            throws RepositoryManagerException {
-        ProductType productType = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        repositoryManager.addProductType(productType);
-        return productType.getProductTypeId();
+  public String addProductTypeCore(Map<String, Object> productTypeHash)
+      throws RepositoryManagerException {
+    ProductType productType = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    repositoryManager.addProductType(productType);
+    return productType.getProductTypeId();
 
-    }
+  }
 
   public synchronized boolean setProductTransferStatus(
       Hashtable<String, Object> productHash)
@@ -395,6 +397,7 @@ public class XmlRpcFileManager {
       throws CatalogException {
     return this.getNumProductsCore(productTypeHash);
   }
+
   public int getNumProductsCore(Map<String, Object> productTypeHash)
       throws CatalogException {
     int numProducts;
@@ -415,22 +418,6 @@ public class XmlRpcFileManager {
     return numProducts;
   }
 
-  public List<Map<String, Object>> getTopNProductsMap(int n)
-            throws CatalogException {
-        List<Product> topNProducts;
-
-        try {
-            topNProducts = catalog.getTopNProducts(n);
-            return XmlRpcStructFactory.getXmlRpcProductListMap(topNProducts);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.WARNING,
-                    "Exception when getting topN products: Message: "
-                            + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        }
-    }
-
   public List<Map<String, Object>> getTopNProducts(int n)
       throws CatalogException {
     List<Product> topNProducts;
@@ -452,72 +439,75 @@ public class XmlRpcFileManager {
       throws CatalogException {
     return this.getTopNProductsCore(n, productTypeHash);
   }
-    public List<Map<String, Object>> getTopNProductsCore(int n,
-            Map<String, Object> productTypeHash)
-            throws CatalogException {
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        List<Product> topNProducts;
 
-        try {
-            topNProducts = catalog.getTopNProducts(n, type);
-            return XmlRpcStructFactory.getXmlRpcProductListMap(topNProducts);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.WARNING,
-                    "Exception when getting topN products by product type: ["
-                            + type.getProductTypeId() + "]: Message: "
-                            + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        }
+  public List<Map<String, Object>> getTopNProductsCore(int n,
+                                                       Map<String, Object> productTypeHash)
+      throws CatalogException {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    List<Product> topNProducts;
 
+    try {
+      topNProducts = catalog.getTopNProducts(n, type);
+      return XmlRpcStructFactory.getXmlRpcProductList(topNProducts);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.WARNING,
+          "Exception when getting topN products by product type: ["
+          + type.getProductTypeId() + "]: Message: "
+          + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
     }
 
-    public boolean hasProduct(String productName) throws CatalogException {
-        Product p = catalog.getProductByName(productName);
-        return p != null
-                && p.getTransferStatus().equals(Product.STATUS_RECEIVED);
-    }
+  }
+
+  public boolean hasProduct(String productName) throws CatalogException {
+    Product p = catalog.getProductByName(productName);
+    return p != null
+           && p.getTransferStatus().equals(Product.STATUS_RECEIVED);
+  }
 
 
   public Map<String, Object> getMetadata(
       Hashtable<String, Object> productHash) throws CatalogException {
     return this.getMetadataCore(productHash);
   }
-    public Map<String, Object> getMetadataCore(
-        Map<String, Object> productHash) throws CatalogException {
-        Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        return this.getMetadata(product).getHashTable();
-    }
+
+  public Map<String, Object> getMetadataCore(
+      Map<String, Object> productHash) throws CatalogException {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return this.getMetadata(product).getHashTable();
+  }
 
   public Map<String, Object> getReducedMetadata(
       Hashtable<String, Object> productHash, Vector<String> elements)
       throws CatalogException {
     return this.getReducedMetadataCore(productHash, elements);
   }
-    public Map<String, Object> getReducedMetadataCore(
-            Map<String, Object> productHash, Vector<String> elements)
-            throws CatalogException {
-        Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        return this.getReducedMetadata(product, elements).getHashTable();
-    }
 
-    public List<Map<String, Object>> getProductTypes()
-            throws RepositoryManagerException {
-        List<ProductType> productTypeList;
+  public Map<String, Object> getReducedMetadataCore(
+      Map<String, Object> productHash, Vector<String> elements)
+      throws CatalogException {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return this.getReducedMetadata(product, elements).getHashTable();
+  }
 
-        try {
-            productTypeList = repositoryManager.getProductTypes();
-            return XmlRpcStructFactory
-                    .getXmlRpcProductTypeList(productTypeList);
-        } catch (RepositoryManagerException e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE,
-                    "Unable to obtain product types from repository manager: Message: "
-                            + e.getMessage());
-            throw new RepositoryManagerException(e.getMessage(), e);
-        }
+  public List<Map<String, Object>> getProductTypes()
+      throws RepositoryManagerException {
+    List<ProductType> productTypeList;
+
+    try {
+      productTypeList = repositoryManager.getProductTypes();
+      return XmlRpcStructFactory
+          .getXmlRpcProductTypeList(productTypeList);
+    } catch (RepositoryManagerException e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE,
+          "Unable to obtain product types from repository manager: Message: "
+          + e.getMessage());
+      throw new RepositoryManagerException(e.getMessage(), e);
     }
+  }
 
   public List<Map<String, Object>> getProductReferences(
       Hashtable<String, Object> productHash)
@@ -543,203 +533,205 @@ public class XmlRpcFileManager {
     }
 
   }
-    public Map<String, Object> getProductById(String productId)
-            throws CatalogException {
-        Product product = null;
 
-        try {
-            product = catalog.getProductById(productId);
-            // it is possible here that the underlying catalog did not
-            // set the ProductType
-            // to obey the contract of the File Manager, we need to make
-            // sure its set here
-            product.setProductType(this.repositoryManager
-                    .getProductTypeById(product.getProductType()
-                            .getProductTypeId()));
-            return XmlRpcStructFactory.getXmlRpcProduct(product);
-        } catch (CatalogException e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE, "Unable to obtain product by id: ["
-                    + productId + "]: Message: " + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        } catch (RepositoryManagerException e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE, "Unable to obtain product type by id: ["
-                    + product.getProductType().getProductTypeId()
-                    + "]: Message: " + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        }
+  public Map<String, Object> getProductById(String productId)
+      throws CatalogException {
+    Product product = null;
 
+    try {
+      product = catalog.getProductById(productId);
+      // it is possible here that the underlying catalog did not
+      // set the ProductType
+      // to obey the contract of the File Manager, we need to make
+      // sure its set here
+      product.setProductType(this.repositoryManager
+          .getProductTypeById(product.getProductType()
+                                     .getProductTypeId()));
+      return XmlRpcStructFactory.getXmlRpcProduct(product);
+    } catch (CatalogException e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE, "Unable to obtain product by id: ["
+                            + productId + "]: Message: " + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
+    } catch (RepositoryManagerException e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE, "Unable to obtain product type by id: ["
+                            + product.getProductType().getProductTypeId()
+                            + "]: Message: " + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
     }
 
-    public Map<String, Object> getProductByName(String productName)
-            throws CatalogException {
-        Product product = null;
+  }
 
-        try {
-            product = catalog.getProductByName(productName);
-            // it is possible here that the underlying catalog did not
-            // set the ProductType
-            // to obey the contract of the File Manager, we need to make
-            // sure its set here
-            product.setProductType(this.repositoryManager
-                    .getProductTypeById(product.getProductType()
-                            .getProductTypeId()));
-            return XmlRpcStructFactory.getXmlRpcProduct(product);
-        } catch (CatalogException e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE, "Unable to obtain product by name: ["
-                    + productName + "]: Message: " + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        } catch (RepositoryManagerException e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE, "Unable to obtain product type by id: ["
-                    + product.getProductType().getProductTypeId()
-                    + "]: Message: " + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        }
+  public Map<String, Object> getProductByName(String productName)
+      throws CatalogException {
+    Product product = null;
+
+    try {
+      product = catalog.getProductByName(productName);
+      // it is possible here that the underlying catalog did not
+      // set the ProductType
+      // to obey the contract of the File Manager, we need to make
+      // sure its set here
+      product.setProductType(this.repositoryManager
+          .getProductTypeById(product.getProductType()
+                                     .getProductTypeId()));
+      return XmlRpcStructFactory.getXmlRpcProduct(product);
+    } catch (CatalogException e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE, "Unable to obtain product by name: ["
+                            + productName + "]: Message: " + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
+    } catch (RepositoryManagerException e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE, "Unable to obtain product type by id: ["
+                            + product.getProductType().getProductTypeId()
+                            + "]: Message: " + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
     }
+  }
 
   public List<Map<String, Object>> getProductsByProductType(
       Hashtable<String, Object> productTypeHash)
       throws CatalogException {
     return this.getProductsByProductTypeCore(productTypeHash);
   }
-    public List<Map<String, Object>> getProductsByProductTypeCore(
-            Map<String, Object> productTypeHash)
-            throws CatalogException {
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        List<Product> productList;
 
-        try {
-            productList = catalog.getProductsByProductType(type);
-            return XmlRpcStructFactory.getXmlRpcProductListMap(productList);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE,
-                    "Exception obtaining products by product type for type: ["
-                            + type.getName() + "]: Message: " + e.getMessage());
-            throw new CatalogException(e.getMessage(), e);
-        }
-    }
+  public List<Map<String, Object>> getProductsByProductTypeCore(
+      Map<String, Object> productTypeHash)
+      throws CatalogException {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    List<Product> productList;
 
-    public List<Map<String, Object>> getElementsByProductType(
-            Map<String, Object> productTypeHash)
-            throws ValidationLayerException {
-        ProductType type = XmlRpcStructFactory
-                .getProductTypeFromXmlRpc(productTypeHash);
-        List<Element> elementList;
+    try {
+      productList = catalog.getProductsByProductType(type);
+      return XmlRpcStructFactory.getXmlRpcProductList(productList);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE,
+          "Exception obtaining products by product type for type: ["
+          + type.getName() + "]: Message: " + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
+    }
+  }
 
-        try {
-            elementList = catalog.getValidationLayer().getElements(type);
-          Map hm = new ConcurrentHashMap();
-            return XmlRpcStructFactory.getXmlRpcElementList(elementList);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE,
-                    "Exception obtaining elements for product type: ["
-                            + type.getName() + "]: Message: " + e.getMessage());
-            throw new ValidationLayerException(e.getMessage(), e);
-        }
+  public List<Map<String, Object>> getElementsByProductType(
+      Map<String, Object> productTypeHash)
+      throws ValidationLayerException {
+    ProductType type = XmlRpcStructFactory
+        .getProductTypeFromXmlRpc(productTypeHash);
+    List<Element> elementList;
 
+    try {
+      elementList = catalog.getValidationLayer().getElements(type);
+      return XmlRpcStructFactory.getXmlRpcElementList(elementList);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE,
+          "Exception obtaining elements for product type: ["
+          + type.getName() + "]: Message: " + e.getMessage());
+      throw new ValidationLayerException(e.getMessage(), e);
     }
 
-    public Map<String, Object> getElementById(String elementId)
-            throws ValidationLayerException {
-        Element element;
+  }
 
-        try {
-            element = catalog.getValidationLayer().getElementById(elementId);
-            return XmlRpcStructFactory.getXmlRpcElement(element);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE, "exception retrieving element by id: ["
-                    + elementId + "]: Message: " + e.getMessage());
-            throw new ValidationLayerException(e.getMessage(), e);
-        }
+  public Map<String, Object> getElementById(String elementId)
+      throws ValidationLayerException {
+    Element element;
+
+    try {
+      element = catalog.getValidationLayer().getElementById(elementId);
+      return XmlRpcStructFactory.getXmlRpcElement(element);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE, "exception retrieving element by id: ["
+                            + elementId + "]: Message: " + e.getMessage());
+      throw new ValidationLayerException(e.getMessage(), e);
     }
+  }
 
-    public Map<String, Object> getElementByName(String elementName)
-            throws ValidationLayerException {
-        Element element;
+  public Map<String, Object> getElementByName(String elementName)
+      throws ValidationLayerException {
+    Element element;
 
-        try {
-            element = catalog.getValidationLayer()
-                    .getElementByName(elementName);
-            return XmlRpcStructFactory.getXmlRpcElement(element);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE, "exception retrieving element by name: ["
-                    + elementName + "]: Message: " + e.getMessage());
-            throw new ValidationLayerException(e.getMessage(), e);
-        }
+    try {
+      element = catalog.getValidationLayer()
+                       .getElementByName(elementName);
+      return XmlRpcStructFactory.getXmlRpcElement(element);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE, "exception retrieving element by name: ["
+                            + elementName + "]: Message: " + e.getMessage());
+      throw new ValidationLayerException(e.getMessage(), e);
     }
+  }
 
-  public List<Map<String,Object>> complexQuery(Hashtable<String, Object> complexQueryHash) throws CatalogException{
+  public List<Map<String, Object>> complexQuery(Hashtable<String, Object> complexQueryHash) throws CatalogException {
     return this.complexQueryCore(complexQueryHash);
   }
 
-    public List<Map<String, Object>> complexQueryCore(
-            Map<String, Object> complexQueryHash) throws CatalogException {
-        try {
-            ComplexQuery complexQuery = XmlRpcStructFactory
-                    .getComplexQueryFromXmlRpcMap(complexQueryHash);
-
-            // get ProductTypes
-            List<ProductType> productTypes;
-            if (complexQuery.getReducedProductTypeNames() == null) {
-                productTypes = this.repositoryManager.getProductTypes();
-            } else {
-                productTypes = new Vector<ProductType>();
-                for (String productTypeName : complexQuery
-                        .getReducedProductTypeNames()) {
-                  productTypes.add(this.repositoryManager
-                      .getProductTypeByName(productTypeName));
-                }
-            }
-
-            // get Metadata
-            List<QueryResult> queryResults = new LinkedList<QueryResult>();
-            for (ProductType productType : productTypes) {
-                List<String> productIds = catalog.query(this.getCatalogQuery(
-                        complexQuery, productType), productType);
-                for (String productId : productIds) {
-                    Product product = catalog.getProductById(productId);
-                    product.setProductType(productType);
-                    QueryResult qr = new QueryResult(product, this
-                            .getReducedMetadata(product, complexQuery
-                                    .getReducedMetadata()));
-                    qr.setToStringFormat(complexQuery
-                            .getToStringResultFormat());
-                    queryResults.add(qr);
-                }
-            }
-
-            LOG.log(Level.INFO, "Query returned " + queryResults.size()
-                    + " results");
-
-            // filter query results
-            if (complexQuery.getQueryFilter() != null) {
-                queryResults = applyFilterToResults(queryResults, complexQuery
-                        .getQueryFilter());
-                LOG.log(Level.INFO, "Filter returned " + queryResults.size()
-                        + " results");
-            }
-
-            // sort query results
-            if (complexQuery.getSortByMetKey() != null) {
-              queryResults = sortQueryResultList(queryResults, complexQuery
-                  .getSortByMetKey());
-            }
-
-            return XmlRpcStructFactory.getXmlRpcQueryResultsMap(queryResults);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            throw new CatalogException("Failed to perform complex query : "
-                    + e.getMessage(), e);
+  public List<Map<String, Object>> complexQueryCore(
+      Map<String, Object> complexQueryHash) throws CatalogException {
+    try {
+      ComplexQuery complexQuery = XmlRpcStructFactory
+          .getComplexQueryFromXmlRpc(complexQueryHash);
+
+      // get ProductTypes
+      List<ProductType> productTypes;
+      if (complexQuery.getReducedProductTypeNames() == null) {
+        productTypes = this.repositoryManager.getProductTypes();
+      } else {
+        productTypes = new Vector<ProductType>();
+        for (String productTypeName : complexQuery
+            .getReducedProductTypeNames()) {
+          productTypes.add(this.repositoryManager
+              .getProductTypeByName(productTypeName));
         }
+      }
+
+      // get Metadata
+      List<QueryResult> queryResults = new LinkedList<QueryResult>();
+      for (ProductType productType : productTypes) {
+        List<String> productIds = catalog.query(this.getCatalogQuery(
+            complexQuery, productType), productType);
+        for (String productId : productIds) {
+          Product product = catalog.getProductById(productId);
+          product.setProductType(productType);
+          QueryResult qr = new QueryResult(product, this
+              .getReducedMetadata(product, complexQuery
+                  .getReducedMetadata()));
+          qr.setToStringFormat(complexQuery
+              .getToStringResultFormat());
+          queryResults.add(qr);
+        }
+      }
+
+      LOG.log(Level.INFO, "Query returned " + queryResults.size()
+                          + " results");
+
+      // filter query results
+      if (complexQuery.getQueryFilter() != null) {
+        queryResults = applyFilterToResults(queryResults, complexQuery
+            .getQueryFilter());
+        LOG.log(Level.INFO, "Filter returned " + queryResults.size()
+                            + " results");
+      }
+
+      // sort query results
+      if (complexQuery.getSortByMetKey() != null) {
+        queryResults = sortQueryResultList(queryResults, complexQuery
+            .getSortByMetKey());
+      }
+
+      return XmlRpcStructFactory.getXmlRpcQueryResults(queryResults);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      throw new CatalogException("Failed to perform complex query : "
+                                 + e.getMessage(), e);
     }
+  }
+
   public List<Map<String, Object>> query(
       Hashtable<String, Object> queryHash,
       Hashtable<String, Object> productTypeHash)
@@ -757,12 +749,6 @@ public class XmlRpcFileManager {
     return XmlRpcStructFactory.getXmlRpcProductList(this.query(query, type));
   }
 
-    public Map<String, Object> getProductTypeByNameMap(String productTypeName)
-            throws RepositoryManagerException {
-        ProductType type = repositoryManager
-                .getProductTypeByName(productTypeName);
-        return XmlRpcStructFactory.getXmlRpcProductType(type);
-    }
 
   public Map<String, Object> getProductTypeByName(String productTypeName)
       throws RepositoryManagerException {
@@ -771,66 +757,69 @@ public class XmlRpcFileManager {
     return XmlRpcStructFactory.getXmlRpcProductType(type);
   }
 
-    public Map<String, Object> getProductTypeById(String productTypeId)
-            throws RepositoryManagerException {
-        ProductType type;
+  public Map<String, Object> getProductTypeById(String productTypeId)
+      throws RepositoryManagerException {
+    ProductType type;
 
-        try {
-            type = repositoryManager.getProductTypeById(productTypeId);
-            return XmlRpcStructFactory.getXmlRpcProductType(type);
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE,
-                    "Exception obtaining product type by id for product type: ["
-                            + productTypeId + "]: Message: " + e.getMessage());
-            throw new RepositoryManagerException(e.getMessage(), e);
-        }
+    try {
+      type = repositoryManager.getProductTypeById(productTypeId);
+      return XmlRpcStructFactory.getXmlRpcProductType(type);
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE,
+          "Exception obtaining product type by id for product type: ["
+          + productTypeId + "]: Message: " + e.getMessage());
+      throw new RepositoryManagerException(e.getMessage(), e);
     }
+  }
+
   public synchronized boolean updateMetadata(Hashtable<String, Object> productHash,
-                                                 Hashtable<String, Object> metadataHash) throws CatalogException{
+                                             Hashtable<String, Object> metadataHash) throws CatalogException {
 
     return this.updateMetadataCore(productHash, metadataHash);
   }
 
-    public synchronized boolean updateMetadataCore(Map<String, Object> productHash,
-        Map<String, Object> metadataHash) throws CatalogException{
-        Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        Metadata met = new Metadata();
-        met.addMetadata(metadataHash);
-        Metadata oldMetadata = catalog.getMetadata(product);
-        catalog.removeMetadata(oldMetadata, product);
-        catalog.addMetadata(met, product);
-        return true;
-    }
+  public synchronized boolean updateMetadataCore(Map<String, Object> productHash,
+                                                 Map<String, Object> metadataHash) throws CatalogException {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    Metadata met = new Metadata();
+    met.addMetadata(metadataHash);
+    Metadata oldMetadata = catalog.getMetadata(product);
+    catalog.removeMetadata(oldMetadata, product);
+    catalog.addMetadata(met, product);
+    return true;
+  }
 
   public synchronized String catalogProduct(Hashtable<String, Object> productHash)
       throws CatalogException {
     return this.catalogProductCore(productHash);
 
   }
-    public synchronized String catalogProductCore(Map<String, Object> productHash)
-            throws CatalogException {
-        Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        return catalogProduct(p);
-    }
+
+  public synchronized String catalogProductCore(Map<String, Object> productHash)
+      throws CatalogException {
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return catalogProduct(p);
+  }
 
   public synchronized boolean addMetadata(Hashtable<String, Object> productHash,
                                           Hashtable<String, String> metadata) throws CatalogException {
     return this.addMetadataCore(productHash, metadata);
   }
-    public synchronized boolean addMetadataCore(Map<String, Object> productHash,
-            Map<String, String> metadata) throws CatalogException {
-        Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        Metadata m = new Metadata();
-        m.addMetadata((Map)metadata);
-        return addMetadata(p, m) != null;
-    }
 
-    public synchronized boolean addProductReferencesCore(Map<String, Object> productHash)
-            throws CatalogException {
-        Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-        return addProductReferences(product);
-    }
+  public synchronized boolean addMetadataCore(Map<String, Object> productHash,
+                                              Map<String, String> metadata) throws CatalogException {
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    Metadata m = new Metadata();
+    m.addMetadata((Map) metadata);
+    return addMetadata(p, m) != null;
+  }
+
+  public synchronized boolean addProductReferencesCore(Map<String, Object> productHash)
+      throws CatalogException {
+    Product product = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return addProductReferences(product);
+  }
 
   public synchronized boolean addProductReferences(Hashtable<String, Object> productHash)
       throws CatalogException {
@@ -844,9 +833,9 @@ public class XmlRpcFileManager {
 
 
   public String ingestProductCore(Map<String, Object> productHash,
-      Map<String, String> metadata, boolean clientTransfer)
+                                  Map<String, String> metadata, boolean clientTransfer)
       throws
-        CatalogException {
+      CatalogException {
 
     Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
 
@@ -857,7 +846,7 @@ public class XmlRpcFileManager {
 
       // now add the metadata
       Metadata m = new Metadata();
-      m.addMetadata((Map)metadata);
+      m.addMetadata((Map) metadata);
       Metadata expandedMetdata = addMetadata(p, m);
 
       // version the product
@@ -872,9 +861,9 @@ public class XmlRpcFileManager {
         } catch (Exception e) {
           LOG.log(Level.SEVERE,
               "ingestProduct: VersioningException when versioning Product: "
-                  + p.getProductName() + " with Versioner "
-                  + p.getProductType().getVersioner() + ": Message: "
-                  + e.getMessage());
+              + p.getProductName() + " with Versioner "
+              + p.getProductType().getVersioner() + ": Message: "
+              + e.getMessage());
           throw new VersioningException(e);
         }
 
@@ -884,8 +873,8 @@ public class XmlRpcFileManager {
 
       if (!clientTransfer) {
         LOG.log(Level.FINEST,
-              "File Manager: ingest: no client transfer enabled, "
-                  + "server transfering product: [" + p.getProductName() + "]");
+            "File Manager: ingest: no client transfer enabled, "
+            + "server transfering product: [" + p.getProductName() + "]");
 
         // now transfer the product
         try {
@@ -897,14 +886,14 @@ public class XmlRpcFileManager {
             catalog.setProductTransferStatus(p);
           } catch (CatalogException e) {
             LOG.log(Level.SEVERE, "ingestProduct: CatalogException "
-                + "when updating product transfer status for Product: "
-                + p.getProductName() + " Message: " + e.getMessage());
+                                  + "when updating product transfer status for Product: "
+                                  + p.getProductName() + " Message: " + e.getMessage());
             throw e;
           }
         } catch (Exception e) {
           LOG.log(Level.SEVERE,
               "ingestProduct: DataTransferException when transfering Product: "
-                  + p.getProductName() + ": Message: " + e.getMessage());
+              + p.getProductName() + ": Message: " + e.getMessage());
           throw new DataTransferException(e);
         }
       }
@@ -914,224 +903,230 @@ public class XmlRpcFileManager {
     } catch (Exception e) {
       LOG.log(Level.SEVERE, e.getMessage());
       throw new CatalogException("Error ingesting product [" + p + "] : "
-          + e.getMessage(),e);
+                                 + e.getMessage(), e);
     }
 
   }
+
   public byte[] retrieveFile(String filePath, int offset, int numBytes)
-         throws DataTransferException {
-      FileInputStream is = null;
-      try {
-         byte[] fileData = new byte[numBytes];
-         (is = new FileInputStream(filePath)).skip(offset);
-         int bytesRead = is.read(fileData);
-         if (bytesRead != -1) {
-            byte[] fileDataTruncated = new byte[bytesRead];
-            System.arraycopy(fileData, 0, fileDataTruncated, 0, bytesRead);
-            return fileDataTruncated;
-         } else {
-            return new byte[0];
-         }
-      } catch (Exception e) {
-         LOG.log(Level.SEVERE, "Failed to read '" + numBytes
-               + "' bytes from file '" + filePath + "' at index '" + offset
-               + "' : " + e.getMessage(), e);
-         throw new DataTransferException("Failed to read '" + numBytes
-               + "' bytes from file '" + filePath + "' at index '" + offset
-               + "' : " + e.getMessage(), e);
-      } finally {
-         try {
-           if (is != null) {
-             is.close();
-           }
-         } catch (Exception ignored) {}
+      throws DataTransferException {
+    FileInputStream is = null;
+    try {
+      byte[] fileData = new byte[numBytes];
+      (is = new FileInputStream(filePath)).skip(offset);
+      int bytesRead = is.read(fileData);
+      if (bytesRead != -1) {
+        byte[] fileDataTruncated = new byte[bytesRead];
+        System.arraycopy(fileData, 0, fileDataTruncated, 0, bytesRead);
+        return fileDataTruncated;
+      } else {
+        return new byte[0];
       }
-   }
-    
-    public boolean transferFile(String filePath, byte[] fileData, int offset,
-            int numBytes) {
-        File outFile = new File(filePath);
-        boolean success = true;
-
-        FileOutputStream fOut = null;
-
-        if (outFile.exists()) {
-            try {
-                fOut = new FileOutputStream(outFile, true);
-            } catch (FileNotFoundException e) {
-                LOG.log(Level.SEVERE, e.getMessage());
-                LOG.log(Level.SEVERE,
-                        "FileNotFoundException when trying to use RandomAccess file on "
-                                + filePath + ": Message: " + e.getMessage());
-                success = false;
-            }
-        } else {
-            // create the output directory
-            String outFileDirPath = outFile.getAbsolutePath().substring(0,
-                    outFile.getAbsolutePath().lastIndexOf("/"));
-            LOG.log(Level.INFO, "Outfile directory: " + outFileDirPath);
-            File outFileDir = new File(outFileDirPath);
-            outFileDir.mkdirs();
-
-            try {
-                fOut = new FileOutputStream(outFile, false);
-            } catch (FileNotFoundException e) {
-                LOG.log(Level.SEVERE, e.getMessage());
-                LOG.log(Level.SEVERE,
-                        "FileNotFoundException when trying to use RandomAccess file on "
-                                + filePath + ": Message: " + e.getMessage());
-                success = false;
-            }
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, "Failed to read '" + numBytes
+                            + "' bytes from file '" + filePath + "' at index '" + offset
+                            + "' : " + e.getMessage(), e);
+      throw new DataTransferException("Failed to read '" + numBytes
+                                      + "' bytes from file '" + filePath + "' at index '" + offset
+                                      + "' : " + e.getMessage(), e);
+    } finally {
+      try {
+        if (is != null) {
+          is.close();
         }
+      } catch (Exception ignored) {
+      }
+    }
+  }
 
-        if (success) {
-            try {
-                fOut.write(fileData, (int) offset, (int) numBytes);
-            } catch (IOException e) {
-                LOG.log(Level.SEVERE, e.getMessage());
-                LOG.log(Level.SEVERE, "IOException when trying to write file "
-                        + filePath + ": Message: " + e.getMessage());
-                success = false;
-            } finally {
-              try {
-                  fOut.close();
-              } catch (Exception ignore) {
-              }
-
-            }
+  public boolean transferFile(String filePath, byte[] fileData, int offset,
+                              int numBytes) {
+    File outFile = new File(filePath);
+    boolean success = true;
+
+    FileOutputStream fOut = null;
+
+    if (outFile.exists()) {
+      try {
+        fOut = new FileOutputStream(outFile, true);
+      } catch (FileNotFoundException e) {
+        LOG.log(Level.SEVERE, e.getMessage());
+        LOG.log(Level.SEVERE,
+            "FileNotFoundException when trying to use RandomAccess file on "
+            + filePath + ": Message: " + e.getMessage());
+        success = false;
+      }
+    } else {
+      // create the output directory
+      String outFileDirPath = outFile.getAbsolutePath().substring(0,
+          outFile.getAbsolutePath().lastIndexOf("/"));
+      LOG.log(Level.INFO, "Outfile directory: " + outFileDirPath);
+      File outFileDir = new File(outFileDirPath);
+      outFileDir.mkdirs();
+
+      try {
+        fOut = new FileOutputStream(outFile, false);
+      } catch (FileNotFoundException e) {
+        LOG.log(Level.SEVERE, e.getMessage());
+        LOG.log(Level.SEVERE,
+            "FileNotFoundException when trying to use RandomAccess file on "
+            + filePath + ": Message: " + e.getMessage());
+        success = false;
+      }
+    }
+
+    if (success) {
+      try {
+        fOut.write(fileData, (int) offset, (int) numBytes);
+      } catch (IOException e) {
+        LOG.log(Level.SEVERE, e.getMessage());
+        LOG.log(Level.SEVERE, "IOException when trying to write file "
+                              + filePath + ": Message: " + e.getMessage());
+        success = false;
+      } finally {
+        try {
+          fOut.close();
+        } catch (Exception ignore) {
         }
 
-      return success;
+      }
     }
 
+    return success;
+  }
+
   public boolean moveProduct(Hashtable<String, Object> productHash, String newPath)
       throws DataTransferException {
 
     return this.moveProductCore(productHash, newPath);
   }
-    public boolean moveProductCore(Map<String, Object> productHash, String newPath)
-            throws DataTransferException {
-
-        Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
-
-        // first thing we care about is if the product is flat or heirarchical
-        if (p.getProductStructure().equals(Product.STRUCTURE_FLAT)) {
-            // we just need to get its first reference
-            if (p.getProductReferences() == null || (p.getProductReferences().size() != 1)) {
-                throw new DataTransferException(
-                        "Flat products must have a single reference: cannot move");
-            }
-
-            // okay, it's fine to move it
-            // first, we need to update the data store ref
-            Reference r = p.getProductReferences().get(0);
-            if (r.getDataStoreReference().equals(
-                    new File(newPath).toURI().toString())) {
-                throw new DataTransferException("cannot move product: ["
-                        + p.getProductName() + "] to same location: ["
-                        + r.getDataStoreReference() + "]");
-            }
-
-            // create a copy of the current data store path: we'll need it to
-            // do the data transfer
-            Reference copyRef = new Reference(r);
-
-            // update the copyRef to have the data store ref as the orig ref
-            // the the newLoc as the new ref
-            copyRef.setOrigReference(r.getDataStoreReference());
-            copyRef.setDataStoreReference(new File(newPath).toURI().toString());
-
-            p.getProductReferences().clear();
-            p.getProductReferences().add(copyRef);
-
-            // now transfer it
-            try {
-                this.dataTransfer.transferProduct(p);
-            } catch (IOException e) {
-                throw new DataTransferException(e);
-            }
-
-            // now delete the original copy
-            try {
-                if (!new File(new URI(copyRef.getOrigReference())).delete()) {
-                    LOG.log(Level.WARNING, "Deletion of original file: ["
-                            + r.getDataStoreReference()
-                            + "] on product move returned false");
-                }
-            } catch (URISyntaxException e) {
-                throw new DataTransferException(
-                        "URI Syntax exception trying to remove original product ref: Message: "
-                                + e.getMessage(), e);
-            }
-
-            // now save the updated reference
-            try {
-                this.catalog.modifyProduct(p);
-                return true;
-            } catch (CatalogException e) {
-                throw new DataTransferException(e.getMessage(),e);
-            }
-        } else {
-          throw new UnsupportedOperationException(
-              "Moving of heirarhical and stream products not supported yet");
+
+  public boolean moveProductCore(Map<String, Object> productHash, String newPath)
+      throws DataTransferException {
+
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+
+    // first thing we care about is if the product is flat or heirarchical
+    if (p.getProductStructure().equals(Product.STRUCTURE_FLAT)) {
+      // we just need to get its first reference
+      if (p.getProductReferences() == null || (p.getProductReferences().size() != 1)) {
+        throw new DataTransferException(
+            "Flat products must have a single reference: cannot move");
+      }
+
+      // okay, it's fine to move it
+      // first, we need to update the data store ref
+      Reference r = p.getProductReferences().get(0);
+      if (r.getDataStoreReference().equals(
+          new File(newPath).toURI().toString())) {
+        throw new DataTransferException("cannot move product: ["
+                                        + p.getProductName() + "] to same location: ["
+                                        + r.getDataStoreReference() + "]");
+      }
+
+      // create a copy of the current data store path: we'll need it to
+      // do the data transfer
+      Reference copyRef = new Reference(r);
+
+      // update the copyRef to have the data store ref as the orig ref
+      // the the newLoc as the new ref
+      copyRef.setOrigReference(r.getDataStoreReference());
+      copyRef.setDataStoreReference(new File(newPath).toURI().toString());
+
+      p.getProductReferences().clear();
+      p.getProductReferences().add(copyRef);
+
+      // now transfer it
+      try {
+        this.dataTransfer.transferProduct(p);
+      } catch (IOException e) {
+        throw new DataTransferException(e);
+      }
+
+      // now delete the original copy
+      try {
+        if (!new File(new URI(copyRef.getOrigReference())).delete()) {
+          LOG.log(Level.WARNING, "Deletion of original file: ["
+                                 + r.getDataStoreReference()
+                                 + "] on product move returned false");
         }
-    }
+      } catch (URISyntaxException e) {
+        throw new DataTransferException(
+            "URI Syntax exception trying to remove original product ref: Message: "
+            + e.getMessage(), e);
+      }
 
-    public boolean removeFile(String filePath) throws DataTransferException, IOException {
-      // TODO(bfoster): Clean this up so that it deletes by product not file.
-      Product product = new Product();
-      Reference r = new Reference();
-      r.setDataStoreReference(filePath);
-      product.setProductReferences(Lists.newArrayList(r));
-      dataTransfer.deleteProduct(product);
-      return true;
+      // now save the updated reference
+      try {
+        this.catalog.modifyProduct(p);
+        return true;
+      } catch (CatalogException e) {
+        throw new DataTransferException(e.getMessage(), e);
+      }
+    } else {
+      throw new UnsupportedOperationException(
+          "Moving of heirarhical and stream products not supported yet");
     }
+  }
+
+  public boolean removeFile(String filePath) throws DataTransferException, IOException {
+    // TODO(bfoster): Clean this up so that it deletes by product not file.
+    Product product = new Product();
+    Reference r = new Reference();
+    r.setDataStoreReference(filePath);
+    product.setProductReferences(Lists.newArrayList(r));
+    dataTransfer.deleteProduct(product);
+    return true;
+  }
 
   public boolean modifyProduct(Hashtable<?, ?> productHash) throws CatalogException {
     return this.modifyProductCore(productHash);
   }
-    public boolean modifyProductCore(Map<?, ?> productHash) throws CatalogException {
-        Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
 
-        try {
-            catalog.modifyProduct(p);
-        } catch (CatalogException e) {
-            LOG.log(Level.WARNING, "Exception modifying product: ["
-                    + p.getProductId() + "]: Message: " + e.getMessage(), e);
-            throw e;
-        }
+  public boolean modifyProductCore(Map<?, ?> productHash) throws CatalogException {
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
 
-        return true;
+    try {
+      catalog.modifyProduct(p);
+    } catch (CatalogException e) {
+      LOG.log(Level.WARNING, "Exception modifying product: ["
+                             + p.getProductId() + "]: Message: " + e.getMessage(), e);
+      throw e;
     }
 
-    public boolean removeProduct(Map<String, Object> productHash) throws CatalogException {
-        Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
+    return true;
+  }
 
-        try {
-            catalog.removeProduct(p);
-        } catch (CatalogException e) {
-            LOG.log(Level.WARNING, "Exception modifying product: ["
-                    + p.getProductId() + "]: Message: " + e.getMessage(), e);
-            throw e;
-        }
+  public boolean removeProduct(Map<String, Object> productHash) throws CatalogException {
+    Product p = XmlRpcStructFactory.getProductFromXmlRpc(productHash);
 
-        return true;
+    try {
+      catalog.removeProduct(p);
+    } catch (CatalogException e) {
+      LOG.log(Level.WARNING, "Exception modifying product: ["
+                             + p.getProductId() + "]: Message: " + e.getMessage(), e);
+      throw e;
     }
+
+    return true;
+  }
+
   public Map<String, Object> getCatalogValues(
       Hashtable<String, Object> metadataHash,
       Hashtable<String, Object> productTypeHash)
       throws RepositoryManagerException {
     return this.getCatalogValuesCore(metadataHash, productTypeHash);
   }
-    public Map<String, Object> getCatalogValuesCore(
-            Map<String, Object> metadataHash,
-            Map<String, Object> productTypeHash)
-            throws RepositoryManagerException {
-        Metadata m = new Metadata();
-        m.addMetadata(metadataHash);
-        ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
-        return this.getCatalogValues(m, productType).getHashTable();
-    }
+
+  public Map<String, Object> getCatalogValuesCore(
+      Map<String, Object> metadataHash,
+      Map<String, Object> productTypeHash)
+      throws RepositoryManagerException {
+    Metadata m = new Metadata();
+    m.addMetadata(metadataHash);
+    ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
+    return this.getCatalogValues(m, productType).getHashTable();
+  }
 
   public Map<String, Object> getOrigValues(
       Hashtable<String, Object> metadataHash,
@@ -1140,15 +1135,15 @@ public class XmlRpcFileManager {
     return this.getOrigValuesCore(metadataHash, productTypeHash);
   }
 
-    public Map<String, Object> getOrigValuesCore(
-        Map<String, Object> metadataHash,
-        Map<String, Object> productTypeHash)
-            throws RepositoryManagerException {
-        Metadata m = new Metadata();
-        m.addMetadata(metadataHash);
-        ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
-        return this.getOrigValues(m, productType).getHashTable();
-    }
+  public Map<String, Object> getOrigValuesCore(
+      Map<String, Object> metadataHash,
+      Map<String, Object> productTypeHash)
+      throws RepositoryManagerException {
+    Metadata m = new Metadata();
+    m.addMetadata(metadataHash);
+    ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
+    return this.getOrigValues(m, productType).getHashTable();
+  }
 
   public Map<String, Object> getCatalogQuery(
       Hashtable<String, Object> queryHash,
@@ -1156,305 +1151,306 @@ public class XmlRpcFileManager {
       throws RepositoryManagerException, QueryFormulationException {
     return this.getCatalogQueryCore(queryHash, productTypeHash);
   }
-    public Map<String, Object> getCatalogQueryCore(
-            Map<String, Object> queryHash,
-            Map<String, Object> productTypeHash)
-            throws RepositoryManagerException, QueryFormulationException {
-        Query query = XmlRpcStructFactory.getQueryFromXmlRpcMap(queryHash);
-        ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
-        return XmlRpcStructFactory.getXmlRpcQuery(this.getCatalogQuery(query, productType));
-    }
-
 
-  public static void main(String[] args) throws IOException {
-        int portNum = -1;
-        String usage = "FileManager --portNum <port number for xml rpc service>\n";
+  public Map<String, Object> getCatalogQueryCore(
+      Map<String, Object> queryHash,
+      Map<String, Object> productTypeHash)
+      throws RepositoryManagerException, QueryFormulationException {
+    Query query = XmlRpcStructFactory.getQueryFromXmlRpc(queryHash);
+    ProductType productType = XmlRpcStructFactory.getProductTypeFromXmlRpc(productTypeHash);
+    return XmlRpcStructFactory.getXmlRpcQuery(this.getCatalogQuery(query, productType));
+  }
 
-        for (int i = 0; i < args.length; i++) {
-            if (args[i].equals("--portNum")) {
-                portNum = Integer.parseInt(args[++i]);
-            }
-        }
 
-        if (portNum == -1) {
-            System.err.println(usage);
-            System.exit(1);
-        }
-        
-        @SuppressWarnings("unused")
-        XmlRpcFileManager manager = new XmlRpcFileManager(portNum);
+  public static void main(String[] args) throws IOException {
+    int portNum = -1;
+    String usage = "FileManager --portNum <port number for xml rpc service>\n";
 
-        for (;;) {
-          try {
-            Thread.currentThread().join();
-          } catch (InterruptedException ignore) {
-          }
-        }
+    for (int i = 0; i < args.length; i++) {
+      if (args[i].equals("--portNum")) {
+        portNum = Integer.parseInt(args[++i]);
+      }
     }
 
-    public boolean shutdown() {
-        if (this.webServer != null) {
-            this.webServer.shutdown();
-            this.webServer = null;
-            return true;
-        } else {
-          return false;
-        }
+    if (portNum == -1) {
+      System.err.println(usage);
+      System.exit(1);
     }
 
-    private synchronized String catalogProduct(Product p)
-            throws CatalogException {
-        try {
-            catalog.addProduct(p);
-        } catch (CatalogException e) {
-            LOG.log(Level.SEVERE,
-                    "ingestProduct: CatalogException when adding Product: "
-                            + p.getProductName() + " to Catalog: Message: "
-                            + e.getMessage());
-            throw e;
-        }
+    @SuppressWarnings("unused")
+    XmlRpcFileManager manager = new XmlRpcFileManager(portNum);
 
-        return p.getProductId();
+    for (; ; ) {
+      try {
+        Thread.currentThread().join();
+      } catch (InterruptedException ignore) {
+      }
     }
+  }
 
-    private synchronized Metadata addMetadata(Product p, Metadata m)
-            throws CatalogException {
-        
-        //apply handlers
-        try {
-            m = this.getCatalogValues(m, p.getProductType());
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, "Failed to get handlers for product '" + p
-                    + "' : " + e.getMessage());
-        }
-        
-        // first do server side metadata extraction
-        Metadata metadata = runExtractors(p, m);
-
-        try {
-            catalog.addMetadata(metadata, p);
-        } catch (CatalogException e) {
-            LOG.log(Level.SEVERE,
-                    "ingestProduct: CatalogException when adding metadata "
-                            + metadata + " for product: " + p.getProductName()
-                            + ": Message: " + e.getMessage());
-            throw e;
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE,
-                    "ingestProduct: General Exception when adding metadata "
-                            + metadata + " for product: " + p.getProductName()
-                            + ": Message: " + e.getMessage());
-            throw new CatalogException(e.getMessage(),e);
-        }
+  public boolean shutdown() {
+    if (this.webServer != null) {
+      this.webServer.shutdown();
+      this.webServer = null;
+      return true;
+    } else {
+      return false;
+    }
+  }
 
-        return metadata;
+  private synchronized String catalogProduct(Product p)
+      throws CatalogException {
+    try {
+      catalog.addProduct(p);
+    } catch (CatalogException e) {
+      LOG.log(Level.SEVERE,
+          "ingestProduct: CatalogException when adding Product: "
+          + p.getProductName() + " to Catalog: Message: "
+          + e.getMessage());
+      throw e;
     }
 
-    private Metadata runExtractors(Product product, Metadata metadata) throws CatalogException {
-        // make sure that the product type definition is present
-        if(product.getProductType() == null){
-          LOG.log(Level.SEVERE, "Failed to run extractor for: "+product.getProductId()+":"+product
-              .getProductName()+" product type cannot be null.");
-          throw new CatalogException("Failed to run extractor for: "+product.getProductId()+":"+product
-              .getProductName()+" product type cannot be null.");
-        }
-        try {
-            product.setProductType(repositoryManager.getProductTypeById(product
-                    .getProductType().getProductTypeId()));
-        } catch (RepositoryManagerException e) {
-            LOG.log(Level.SEVERE, "Failed to load ProductType " + product
-              .getProductType().getProductTypeId(), e);
-            return null;
-        }
+    return p.getProductId();
+  }
 
-        Metadata met = new Metadata();
-        met.addMetadata(metadata.getHashTable());
-
-        if (product.getProductType().getExtractors() != null) {
-            for (ExtractorSpec spec: product.getProductType().getExtractors()) {
-                FilemgrMetExtractor extractor = GenericFileManagerObjectFactory
-                        .getExtractorFromClassName(spec.getClassName());
-              if (extractor != null) {
-                extractor.configure(spec.getConfiguration());
-              }
-              LOG.log(Level.INFO, "Running Met Extractor: ["
-                        + (extractor != null ? extractor.getClass().getName() : null)
-                        + "] for product type: ["
-                        + product.getProductType().getName() + "]");
-                try {
-                    met = extractor != null ? extractor.extractMetadata(product, met) : null;
-                } catch (MetExtractionException e) {
-                    LOG.log(Level.SEVERE,
-                            "Exception extractor metadata from product: ["
-                                    + product.getProductName()
-                                    + "]: using extractor: ["
-                                    + extractor.getClass().getName()
-                                    + "]: Message: " + e.getMessage(), e);
-                }
-            }
-        }
+  private synchronized Metadata addMetadata(Product p, Metadata m)
+      throws CatalogException {
 
-        return met;
+    //apply handlers
+    try {
+      m = this.getCatalogValues(m, p.getProductType());
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, "Failed to get handlers for product '" + p
+                            + "' : " + e.getMessage());
     }
 
-    private synchronized boolean addProductReferences(Product product)
-            throws CatalogException {
-        catalog.addProductReferences(product);
-        return true;
+    // first do server side metadata extraction
+    Metadata metadata = runExtractors(p, m);
+
+    try {
+      catalog.addMetadata(metadata, p);
+    } catch (CatalogException e) {
+      LOG.log(Level.SEVERE,
+          "ingestProduct: CatalogException when adding metadata "
+          + metadata + " for product: " + p.getProductName()
+          + ": Message: " + e.getMessage());
+      throw e;
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE,
+          "ingestProduct: General Exception when adding metadata "
+          + metadata + " for product: " + p.getProductName()
+          + ": Message: " + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
     }
 
-    private void setProductType(List<Product> products) throws RepositoryManagerException {
-        if (products != null && products.size() > 0) {
-          for (Product p : products) {
-              p.setProductType(repositoryManager.getProductTypeById(p
-                  .getProductType().getProductTypeId()));
-          }
-        }
+    return metadata;
+  }
+
+  private Metadata runExtractors(Product product, Metadata metadata) throws CatalogException {
+    // make sure that the product type definition is present
+    if (product.getProductType() == null) {
+      LOG.log(Level.SEVERE, "Failed to run extractor for: " + product.getProductId() + ":" + product
+          .getProductName() + " product type cannot be null.");
+      throw new CatalogException("Failed to run extractor for: " + product.getProductId() + ":" + product
+          .getProductName() + " product type cannot be null.");
     }
-    
-    private List<Product> query(Query query, ProductType productType) throws CatalogException {
-        List<String> productIdList;
-        List<Product> productList;
-
-        try {            
-            productIdList = catalog.query(this.getCatalogQuery(query, productType), productType);
-
-            if (productIdList != null && productIdList.size() > 0) {
-                productList = new Vector<Product>(productIdList.size());
-              for (String productId : productIdList) {
-                Product product = catalog.getProductById(productId);
-                // it is possible here that the underlying catalog did not
-                // set the ProductType
-                // to obey the contract of the File Manager, we need to make
-                // sure its set here
-                product.setProductType(this.repositoryManager
-                    .getProductTypeById(product.getProductType()
-                                               .getProductTypeId()));
-                productList.add(product);
-              }
-                return productList;
-            } else {
-                return new Vector<Product>(); // null values not supported by XML-RPC
-            }
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE,
-                    "Exception performing query against catalog for product type: ["
-                            + productType.getName() + "] Message: " + e.getMessage());
-            throw new CatalogException(e.getMessage(),e);
+    try {
+      product.setProductType(repositoryManager.getProductTypeById(product
+          .getProductType().getProductTypeId()));
+    } catch (RepositoryManagerException e) {
+      LOG.log(Level.SEVERE, "Failed to load ProductType " + product
+          .getProductType().getProductTypeId(), e);
+      return null;
+    }
+
+    Metadata met = new Metadata();
+    met.addMetadata(metadata.getHashTable());
+
+    if (product.getProductType().getExtractors() != null) {
+      for (ExtractorSpec spec : product.getProductType().getExtractors()) {
+        FilemgrMetExtractor extractor = GenericFileManagerObjectFactory
+            .getExtractorFromClassName(spec.getClassName());
+        if (extractor != null) {
+          extractor.configure(spec.getConfiguration());
         }
-    }
-    
-    private Metadata getReducedMetadata(Product product, List<String> elements) throws CatalogException {
+        LOG.log(Level.INFO, "Running Met Extractor: ["
+                            + (extractor != null ? extractor.getClass().getName() : null)
+                            + "] for product type: ["
+                            + product.getProductType().getName() + "]");
         try {
-            Metadata m;
-            if (elements != null && elements.size() > 0) {
-                m = catalog.getReducedMetadata(product, elements);
-            }else {
-                m = this.getMetadata(product);
-            }
-            if(this.expandProductMet) {
-              m = this.buildProductMetadata(product, m);
-            }
-            return this.getOrigValues(m, product.getProductType());
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE,
-                    "Exception obtaining metadata from catalog for product: ["
-                            + product.getProductId() + "]: Message: "
-                            + e.getMessage());
-            throw new CatalogException(e.getMessage(),e);
+          met = extractor != null ? extractor.extractMetadata(product, met) : null;
+        } catch (MetExtractionException e) {
+          LOG.log(Level.SEVERE,
+              "Exception extractor metadata from product: ["
+              + product.getProductName()
+              + "]: using extractor: ["
+              + extractor.getClass().getName()
+              + "]: Message: " + e.getMessage(), e);
         }
+      }
     }
-    
-    private Metadata getMetadata(Product product) throws CatalogException {
-        try {
-            Metadata m = catalog.getMetadata(product);
-            if(this.expandProductMet) {
-              m = this.buildProductMetadata(product, m);
-            }
-            return this.getOrigValues(m, product.getProductType());
-        } catch (Exception e) {
-            LOG.log(Level.SEVERE, e.getMessage());
-            LOG.log(Level.SEVERE,
-                    "Exception obtaining metadata from catalog for product: ["
-                            + product.getProductId() + "]: Message: "
-                            + e.getMessage());
-            throw new CatalogException(e.getMessage(),e);
-        }
+
+    return met;
+  }
+
+  private synchronized boolean addProductReferences(Product product)
+      throws CatalogException {
+    catalog.addProductReferences(product);
+    return true;
+  }
+
+  private void setProductType(List<Product> products) throws RepositoryManagerException {
+    if (products != null && products.size() > 0) {
+      for (Product p : products) {
+        p.setProductType(repositoryManager.getProductTypeById(p
+            .getProductType().getProductTypeId()));
+      }
     }
-    
-    private Metadata getOrigValues(Metadata metadata, ProductType productType) 
-            throws RepositoryManagerException {
-        List<TypeHandler> handlers = this.repositoryManager.getProductTypeById(
-                productType.getProductTypeId()).getHandlers();
-        if (handlers != null) {
-          for (TypeHandler handler : handlers) {
-            handler.postGetMetadataHandle(metadata);
-          }
+  }
+
+  private List<Product> query(Query query, ProductType productType) throws CatalogException {
+    List<String> productIdList;
+    List<Product> productList;
+
+    try {
+      productIdList = catalog.query(this.getCatalogQuery(query, productType), productType);
+
+      if (productIdList != null && productIdList.size() > 0) {
+        productList = new Vector<Product>(productIdList.size());
+        for (String productId : productIdList) {
+          Product product = catalog.getProductById(productId);
+          // it is possible here that the underlying catalog did not
+          // set the ProductType
+          // to obey the contract of the File Manager, we need to make
+          // sure its set here
+          product.setProductType(this.repositoryManager
+              .getProductTypeById(product.getProductType()
+                                         .getProductTypeId()));
+          productList.add(product);
         }
-        return metadata;
+        return productList;
+      } else {
+        return new Vector<Product>(); // null values not supported by XML-RPC
+      }
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE,
+          "Exception performing query against catalog for product type: ["
+          + productType.getName() + "] Message: " + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
     }
-    
-    private Metadata getCatalogValues(Metadata metadata, ProductType productType) 
-            throws RepositoryManagerException {
-        List<TypeHandler> handlers = this.repositoryManager.getProductTypeById(
-                productType.getProductTypeId()).getHandlers();
-        if (handlers != null) {
-          for (TypeHandler handler : handlers) {
-            handler.preAddMetadataHandle(metadata);
-          }
-        }
-        return metadata;
+  }
+
+  private Metadata getReducedMetadata(Product product, List<String> elements) throws CatalogException {
+    try {
+      Metadata m;
+      if (elements != null && elements.size() > 0) {
+        m = catalog.getReducedMetadata(product, elements);
+      } else {
+        m = this.getMetadata(product);
+      }
+      if (this.expandProductMet) {
+        m = this.buildProductMetadata(product, m);
+      }
+      return this.getOrigValues(m, product.getProductType());
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE,
+          "Exception obtaining metadata from catalog for product: ["
+          + product.getProductId() + "]: Message: "
+          + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
     }
-    
-    private Query getCatalogQuery(Query query, ProductType productType)
-            throws RepositoryManagerException, QueryFormulationException {
-        List<TypeHandler> handlers = this.repositoryManager.getProductTypeById(
-                productType.getProductTypeId()).getHandlers();
-        if (handlers != null) {
-          for (TypeHandler handler : handlers) {
-            handler.preQueryHandle(query);
-          }
-        }
-        return query;
+  }
+
+  private Metadata getMetadata(Product product) throws CatalogException {
+    try {
+      Metadata m = catalog.getMetadata(product);
+      if (this.expandProductMet) {
+        m = this.buildProductMetadata(product, m);
+      }
+      return this.getOrigValues(m, product.getProductType());
+    } catch (Exception e) {
+      LOG.log(Level.SEVERE, e.getMessage());
+      LOG.log(Level.SEVERE,
+          "Exception obtaining metadata from catalog for product: ["
+          + product.getProductId() + "]: Message: "
+          + e.getMessage());
+      throw new CatalogException(e.getMessage(), e);
     }
+  }
 
-    @SuppressWarnings("unchecked")
-    private List<QueryResult> applyFilterToResults(
-            List<QueryResult> queryResults, QueryFilter queryFilter)
-        throws Exception {
-        List<TimeEvent> events = new LinkedList<TimeEvent>();
-        for (QueryResult queryResult : queryResults) {
-            Metadata m = new Metadata();
-            m.addMetadata(queryFilter.getPriorityMetKey(), queryResult
-                .getMetadata().getMetadata(queryFilter.getPriorityMetKey()));
-            events.add(new ObjectTimeEvent<QueryResult>(
-                DateUtils.getTimeInMillis(DateUtils.toCalendar(queryResult
-                    .getMetadata().getMetadata(queryFilter.getStartDateTimeMetKey()),
-                    DateUtils.FormatType.UTC_FORMAT), DateUtils.julianEpoch), 
-                DateUtils.getTimeInMillis(DateUtils.toCalendar(queryResult.getMetadata()
-                    .getMetadata(queryFilter.getEndDateTimeMetKey()),
-                    DateUtils.FormatType.UTC_FORMAT),
-                DateUtils.julianEpoch), queryFilter.getConverter()
-                    .convertToPriority(this.getCatalogValues(m,
-                    queryResult.getProduct().getProductType())
-                    .getMetadata(queryFilter.getPriorityMetKey())),
-                queryResult));
-        }
-        events = queryFilter.getFilterAlgor().filterEvents(events);
-        List<QueryResult> filteredQueryResults = new LinkedList<QueryResult>();
-        for (TimeEvent event : events) {
-          filteredQueryResults.add(((ObjectTimeEvent<QueryResult>) event)
-              .getTimeObject());
-        }
+  private Metadata getOrigValues(Metadata metadata, ProductType productType)
+      throws RepositoryManagerException {
+    List<TypeHandler> handlers = this.repositoryManager.getProductTypeById(
+        productType.getProductTypeId()).getHandlers();
+    if (handlers != null) {
+      for (TypeHandler handler : handlers) {
+        handler.postGetMetadataHandle(metadata);
+      }
+    }
+    return metadata;
+  }
 
-        return filteredQueryResults;
+  private Metadata getCat

<TRUNCATED>

[6/6] oodt git commit: OODT-917 alter XMLRPC interface to support more generic map types where suitable

Posted by ma...@apache.org.
OODT-917 alter XMLRPC interface to support more generic map types where suitable


Project: http://git-wip-us.apache.org/repos/asf/oodt/repo
Commit: http://git-wip-us.apache.org/repos/asf/oodt/commit/8705ccf4
Tree: http://git-wip-us.apache.org/repos/asf/oodt/tree/8705ccf4
Diff: http://git-wip-us.apache.org/repos/asf/oodt/diff/8705ccf4

Branch: refs/heads/master
Commit: 8705ccf404c883ddd6481a425cd688a82382ef1c
Parents: 3e0e597
Author: Tom Barber <to...@analytical-labs.com>
Authored: Wed Nov 4 12:18:49 2015 +0000
Committer: Tom Barber <to...@analytical-labs.com>
Committed: Wed Nov 4 12:18:49 2015 +0000

----------------------------------------------------------------------
 .../cas/filemgr/system/XmlRpcFileManager.java   | 1943 ++++++++--------
 .../filemgr/system/XmlRpcFileManagerClient.java | 2168 +++++++++---------
 .../cas/filemgr/util/XmlRpcStructFactory.java   | 1342 +++++------
 .../org/apache/oodt/cas/metadata/Metadata.java  |   14 +-
 4 files changed, 2691 insertions(+), 2776 deletions(-)
----------------------------------------------------------------------