blob: ddb98defa9d8cdbd532576f5427292965be772bc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.oodt.cas.product.jaxrs.services;
import org.apache.oodt.cas.filemgr.structs.FileTransferStatus;
import org.apache.oodt.cas.filemgr.structs.Product;
import org.apache.oodt.cas.filemgr.structs.ProductType;
import org.apache.oodt.cas.filemgr.structs.Reference;
import org.apache.oodt.cas.filemgr.system.FileManagerClient;
import org.apache.oodt.cas.metadata.Metadata;
import org.apache.oodt.cas.product.exceptions.CasProductException;
import org.apache.oodt.cas.product.jaxrs.exceptions.BadRequestException;
import org.apache.oodt.cas.product.jaxrs.exceptions.NotFoundException;
import org.apache.oodt.cas.product.jaxrs.resources.DatasetResource;
import org.apache.oodt.cas.product.jaxrs.resources.ProductResource;
import org.apache.oodt.cas.product.jaxrs.resources.ReferenceResource;
import org.apache.oodt.cas.product.jaxrs.resources.TransferResource;
import org.apache.oodt.cas.product.jaxrs.resources.TransfersResource;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
/**
* Service class that handles HTTP requests and returns file manager entities
* such as {@link Reference references} and {@link Product products} as
* JAX-RS resources converted to different formats.
* @author rlaidlaw
* @version $Revision$
*/
public class CasProductJaxrsService
{
private static final Logger LOGGER = Logger.getLogger(CasProductJaxrsService
.class.getName());
// The servlet context, which is used to retrieve context parameters.
@Context
private ServletContext context;
/**
* Gets an HTTP response that represents a {@link Reference} from a {@link
* Product} from the file manager.
* @param productId the ID of the product that the reference belongs to
* @param refIndex the index of the reference within the product's list of
* references
* @return an HTTP response that represents a {@link Reference} from a {@link
* Product} from the file manager
*/
@GET
@Path("reference")
@Produces({"application/octet-stream", "application/xml", "application/json",
"application/atom+xml", "application/rdf+xml", "application/rss+xml",
"application/zip"})
public ReferenceResource getReference(
@QueryParam("productId") String productId,
@QueryParam("refIndex") int refIndex)
{
if (productId == null || productId.trim().equals(""))
{
throw new BadRequestException("This URL requires a productId query "
+ "parameter with a product ID value, "
+ "e.g. /reference?productId=1787a257-df87-11e2-8a2d-e3f6264e86c5");
}
try
{
FileManagerClient client = getContextClient();
Product product = client.getProductById(productId);
List<Reference> references = client.getProductReferences(product);
return new ReferenceResource(productId, refIndex,
references.get(refIndex), getContextWorkingDir());
}
catch (Exception e)
{
String message = "Unable to find the requested resource.";
LOGGER.log(Level.FINE, message, e);
throw new NotFoundException(message + " " + e.getMessage());
}
}
/**
* Gets an HTTP response that represents a {@link Product} from the file
* manager.
* @param productId the ID of the product
* @return an HTTP response that represents a {@link Product} from the file
* manager
*/
@GET
@Path("product")
@Produces({"application/xml", "application/json", "application/atom+xml",
"application/rdf+xml", "application/rss+xml", "application/zip"})
public ProductResource getProduct(@QueryParam("productId") String productId)
{
if (productId == null || productId.trim().equals(""))
{
throw new BadRequestException("This URL requires a productId query "
+ "parameter with a product ID value, "
+ "e.g. /product?productId=1787a257-df87-11e2-8a2d-e3f6264e86c5");
}
try
{
FileManagerClient client = getContextClient();
// Find the product.
Product product = client.getProductById(productId);
product.setProductReferences(client.getProductReferences(product));
// Create the product resource, add the product data and return the
// resource as the HTTP response.
return new ProductResource(product, client.getMetadata(product),
product.getProductReferences(), getContextWorkingDir());
}
catch (Exception e)
{
String message = "Unable to find the requested resource.";
LOGGER.log(Level.FINE, message, e);
throw new NotFoundException(message + " " + e.getMessage());
}
}
/**
* Gets an HTTP response that represents a set of {@link Product products}
* from the file manager.
* @param productTypeId the ID of the {@link ProductType} for the data set or
* "ALL" to denote all product types
* @return an HTTP response that represents a set of {@link Product products}
* from the file manager
*/
@GET
@Path("dataset")
@Produces({"application/xml", "application/json", "application/atom+xml",
"application/rdf+xml", "application/rss+xml", "application/zip"})
public DatasetResource getDataset(
@QueryParam("productTypeId") String productTypeId)
{
if (productTypeId == null || productTypeId.trim().equals(""))
{
throw new BadRequestException("This URL requires a productTypeId query "
+ "parameter and either a product type ID value or 'ALL' for all "
+ "product types.");
}
try
{
FileManagerClient client = getContextClient();
String datasetId;
String datasetName;
Metadata datasetMetadata;
List<ProductType> productTypes = new Vector<ProductType>();
if (productTypeId.equals("ALL"))
{
productTypes = client.getProductTypes();
datasetId = productTypeId;
datasetName = productTypeId;
datasetMetadata = new Metadata();
datasetMetadata.addMetadata("ProductType", productTypeId);
}
else
{
ProductType productType = client.getProductTypeById(productTypeId);
productTypes.add(productType);
datasetId = productType.getProductTypeId();
datasetName = productType.getName();
datasetMetadata = productType.getTypeMetadata();
}
String productDirPath = getContextWorkingDir().getCanonicalPath()
+ "/" + datasetName;
DatasetResource resource = new DatasetResource(datasetId, datasetName,
datasetMetadata, getContextWorkingDir());
// Add all products of the chosen type(s) to the dataset.
for (ProductType productType : productTypes)
{
for (Product product : client.getProductsByProductType(productType))
{
product.setProductReferences(client.getProductReferences(product));
resource.addProductResource(new ProductResource(product,
client.getMetadata(product), product.getProductReferences(),
new File(productDirPath)));
}
}
return resource;
}
catch (Exception e)
{
String message = "Unable to find the requested resource.";
LOGGER.log(Level.FINE, message, e);
throw new NotFoundException(message + " " + e.getMessage());
}
}
/**
* Gets an HTTP response that represents the status of a currently active
* file transfer for the file manager.
* @param dataStoreRef the data store reference for the file being transferred
* @return an HTTP response that represents the status of a currently active
* file transfer for the file manager
*/
@GET
@Path("transfer")
@Produces({"application/xml", "application/json", "application/atom+xml",
"application/rdf+xml", "application/rss+xml"})
public TransferResource getTransfer(
@QueryParam("dataStoreRef") String dataStoreRef)
{
if (dataStoreRef == null || dataStoreRef.trim().equals(""))
{
throw new BadRequestException("This URL requires a dataStoreRef query "
+ "parameter and a data store reference value, "
+ "e.g. /transfer?dataStoreRef=file:/repository/test.txt/test.txt");
}
try
{
FileManagerClient client = getContextClient();
for (FileTransferStatus status : client.getCurrentFileTransfers())
{
Reference reference = status.getFileRef();
if (dataStoreRef.equals(reference.getDataStoreReference()))
{
Product product = status.getParentProduct();
Metadata metadata = client.getMetadata(product);
return new TransferResource(product, metadata, status);
}
}
throw new Exception("Unable to find a current file transfer status for"
+ "data store reference: " + dataStoreRef);
}
catch (Exception e)
{
String message = "Unable to find the requested resource.";
LOGGER.log(Level.FINE, message, e);
throw new NotFoundException(message + " " + e.getMessage());
}
}
/**
* Gets an HTTP response that represents the statuses of all currently active
* file transfers for the file manager, optionally filtered by product ID.
* @param productId the ID of a product or ALL to denote all products
* @return an HTTP response that represents the statuses of all currently
* active file transfers for the file manager
*/
@GET
@Path("transfers")
@Produces({"application/xml", "application/json", "application/atom+xml",
"application/rdf+xml", "application/rss+xml"})
public TransfersResource getTransfers(
@QueryParam("productId") String productId)
{
if (productId == null || productId.trim().equals(""))
{
throw new BadRequestException("This URL requires a productId query "
+ "parameter and either a valid product ID value or 'ALL' for all "
+ "products.");
}
try
{
List<TransferResource> transferResources =
new ArrayList<TransferResource>();
FileManagerClient client = getContextClient();
for (FileTransferStatus status : client.getCurrentFileTransfers())
{
Product product = status.getParentProduct();
if(productId.equals("ALL") || productId.equals(product.getProductId()))
{
Metadata metadata = client.getMetadata(product);
transferResources.add(
new TransferResource(product, metadata, status));
}
}
return new TransfersResource(productId, transferResources);
}
catch (Exception e)
{
String message = "Unable to find the requested resource.";
LOGGER.log(Level.FINE, message, e);
throw new NotFoundException(message + " " + e.getMessage());
}
}
/**
* Gets the file manager's working directory from the servlet context.
* @return the file manager working directory
* @throws Exception if an object cannot be retrieved from the context
* attribute
*/
public File getContextWorkingDir() throws CasProductException {
Object workingDirObject = context.getAttribute("workingDir");
if (workingDirObject != null && workingDirObject instanceof File)
{
return (File) workingDirObject;
}
String message = "Unable to get the file manager's working "
+ "directory from the servlet context.";
LOGGER.log(Level.WARNING, message);
throw new CasProductException(message);
}
/**
* Gets the file manager client instance from the servlet context.
* @return the file manager client instance from the servlet context attribute
* @throws Exception if an object cannot be retrieved from the context
* attribute
*/
public FileManagerClient getContextClient()
throws CasProductException {
// Get the file manager client from the servlet context.
Object clientObject = context.getAttribute("client");
if (clientObject != null &&
clientObject instanceof FileManagerClient)
{
return (FileManagerClient) clientObject;
}
String message = "Unable to get the file manager client from the "
+ "servlet context.";
LOGGER.log(Level.WARNING, message);
throw new CasProductException(message);
}
}