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>
