You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oodt.apache.org by ri...@apache.org on 2012/07/26 02:52:07 UTC

svn commit: r1365858 - in /oodt/trunk/product/src/main: conf/ofsn-ps.xml java/org/apache/oodt/product/handlers/ofsn/URLGetHandler.java

Author: riverma
Date: Thu Jul 26 00:52:07 2012
New Revision: 1365858

URL: http://svn.apache.org/viewvc?rev=1365858&view=rev
Log:
OOD5-456: New OFSN product handler to support generation of list of download URLs associated with an OFSN

Added:
    oodt/trunk/product/src/main/java/org/apache/oodt/product/handlers/ofsn/URLGetHandler.java
Modified:
    oodt/trunk/product/src/main/conf/ofsn-ps.xml

Modified: oodt/trunk/product/src/main/conf/ofsn-ps.xml
URL: http://svn.apache.org/viewvc/oodt/trunk/product/src/main/conf/ofsn-ps.xml?rev=1365858&r1=1365857&r2=1365858&view=diff
==============================================================================
--- oodt/trunk/product/src/main/conf/ofsn-ps.xml (original)
+++ oodt/trunk/product/src/main/conf/ofsn-ps.xml Thu Jul 26 00:52:07 2012
@@ -172,4 +172,30 @@ FIXME: Change XML namespace URI for oodt
        
    </handler>
 
+
+  <!--  
+    The URL type returns a URL listing pointing to files within an OFSN
+    
+    (Optional) Use the below properties to customize the constructed URL returned:
+        1. prodServerHostname: the product server hostname
+        2. prodServerPort: the product server's port
+        3. prodServerContextRoot: the name of the product server webapp
+        4. productRoot: the root directory of the product server - identical
+                        to the root directory at the top of this XML file
+        5. returnType: the desired return type. i.e. RAW, MD5, etc.
+   -->
+  <handler name="URL" type="get"
+       class="org.apache.oodt.product.handlers.ofsn.URLGetHandler">
+       
+       <!-- the below values are the default if nothing specified
+       <property name="prodServerHostname" value="localhost"/>
+       <property name="prodServerPort" value="8080"/>
+       <property name="prodServerContextRoot" value="web-grid"/>
+       <property name="productRoot" value="/some/path"/>
+       <property name="returnType" value="RAW"/>
+       -->
+  	   
+       <property name="mimeType" value="text/plain"/>
+  	   
+  </handler>
 </oodt:ofsn>

Added: oodt/trunk/product/src/main/java/org/apache/oodt/product/handlers/ofsn/URLGetHandler.java
URL: http://svn.apache.org/viewvc/oodt/trunk/product/src/main/java/org/apache/oodt/product/handlers/ofsn/URLGetHandler.java?rev=1365858&view=auto
==============================================================================
--- oodt/trunk/product/src/main/java/org/apache/oodt/product/handlers/ofsn/URLGetHandler.java (added)
+++ oodt/trunk/product/src/main/java/org/apache/oodt/product/handlers/ofsn/URLGetHandler.java Thu Jul 26 00:52:07 2012
@@ -0,0 +1,252 @@
+/*
+ * 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.product.handlers.ofsn;
+
+//JDK imports
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Properties;
+import java.util.logging.Logger;
+
+//OODT imports
+import org.apache.oodt.product.ProductException;
+import org.apache.oodt.product.handlers.ofsn.AbstractCrawlLister;
+import org.apache.oodt.product.handlers.ofsn.OFSNGetHandler;
+
+/**
+  * A {@link OFSNGetHandler} for returning a URL listing pointing to files within an OFSN
+ * 
+ * NOTE: Configuration parameters for this class include:
+ * 1. Server hostname
+ * 2. Server port
+ * 3. Webapp context-root
+ * 4. Path to product-root
+ * 5. Return type desired for URLs
+ * 
+ * @author rverma
+ * @version $Revision$
+ *
+ */
+public class URLGetHandler extends AbstractCrawlLister implements OFSNGetHandler {
+
+	Logger LOG = Logger.getLogger(URLGetHandler.class.getName());
+	
+	// Constants
+	private static final String PROD_SERVER_HOSTNAME = "prodServerHostname";
+	private static final String PROD_SERVER_PORT = "prodServerPort";
+	private static final String PROD_SERVER_CONTEXT = "prodServerContextRoot";
+	private static final String PRODUCT_ROOT = "productRoot";
+	private static final String RETURN_TYPE = "returnType";
+	
+	protected static final String DEFAULT_RETURN_VALUE="";
+	protected static final String DEFAULT_PROD_SERVER_HOSTNAME = "localhost";
+	protected static final String DEFAULT_PROD_SERVER_PORT = "8080";
+	protected static final String DEFAULT_PROD_SERVER_CONTEXT = "web-grid";
+	protected static final String DEFAULT_PRODUCT_ROOT = "/some/path";
+	protected static final String DEFAULT_RETURN_TYPE = "RAW";
+	
+	// Instance
+	private String prodServerHostname = new String();
+	private String prodServerPort = new String();
+	private String prodServerContext = new String();
+	private String productRoot = new String();	
+	private String returnType = new String();
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.apache.oodt.product.handlers.ofsn.AbstractCrawlLister#configure(java.util.Properties)
+	 */
+	public void configure(Properties prop) {
+		
+		if (prop != null) {
+			if (prop.getProperty(PROD_SERVER_HOSTNAME) != null)
+				this.prodServerHostname = prop.getProperty(PROD_SERVER_HOSTNAME);
+			else { 
+				LOG.warning("Configuration property ["+PROD_SERVER_HOSTNAME+"] not specified, using default");
+				this.prodServerHostname = DEFAULT_PROD_SERVER_HOSTNAME;
+			}
+			LOG.info("Property ["+PROD_SERVER_HOSTNAME+"] set with value ["+this.prodServerHostname+"]");
+			
+			if (prop.getProperty(PROD_SERVER_PORT) != null)
+				this.prodServerPort = prop.getProperty(PROD_SERVER_PORT);
+			else { 
+				LOG.warning("Configuration property ["+PROD_SERVER_PORT+"] not specified, using default");
+				this.prodServerPort = DEFAULT_PROD_SERVER_PORT;
+			}
+			LOG.info("Property ["+PROD_SERVER_PORT+"] set with value ["+this.prodServerPort+"]");
+			
+			if (prop.getProperty(PROD_SERVER_CONTEXT) != null)
+				this.prodServerContext = prop.getProperty(PROD_SERVER_CONTEXT);		
+			else { 
+				LOG.warning("Configuration property ["+PROD_SERVER_CONTEXT+"] not specified, using default");
+				this.prodServerContext = DEFAULT_PROD_SERVER_CONTEXT;
+			}
+			LOG.info("Property ["+PROD_SERVER_CONTEXT+"] set with value ["+this.prodServerContext+"]");
+			
+			if (prop.getProperty(PRODUCT_ROOT) != null)
+				this.productRoot = prop.getProperty(PRODUCT_ROOT);		
+			else { 
+				LOG.warning("Configuration property ["+PRODUCT_ROOT+"] not specified, using default");
+				this.productRoot = DEFAULT_PRODUCT_ROOT;
+			}
+			LOG.info("Property ["+PRODUCT_ROOT+"] set with value ["+this.productRoot+"]");
+			
+			if (prop.getProperty(RETURN_TYPE) != null)
+				this.returnType = prop.getProperty(RETURN_TYPE);
+			else { 
+				LOG.warning("Configuration property ["+RETURN_TYPE+"] not specified, using default");
+				this.returnType = DEFAULT_RETURN_TYPE;
+			}
+			LOG.info("Property ["+RETURN_TYPE+"] set with value ["+this.returnType+"]");
+			
+		} else {
+			LOG.warning("Configuration properties could not be loaded");
+		}
+		
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.apache.oodt.product.handlers.ofsn.OFSNGetHandler#retrieveChunk(java.lang.String, long, int)
+	 */
+	public byte[] retrieveChunk(String filepath, long offset, int length)
+			throws ProductException {
+	  
+		LOG.info("Retrieving chunk of URL listing for path: ["+filepath+"] at offset "
+	    			+ offset+" for "+length+" bytes");
+
+		String urlListing = DEFAULT_RETURN_VALUE;
+		try {
+			urlListing = getURLListing(filepath);
+		} catch (ProductException e) {
+			LOG.warning("Unable to obtain byte chunk ("+offset+" - "+(offset+length)+") " 
+					+ "for filepath listing ["+filepath+"]");
+			LOG.warning(e.getMessage());
+		} catch (IllegalArgumentException e) {
+			LOG.warning("Unable to obtain byte chunk ("+offset+" - "+(offset+length)+") " 
+					+ "for filepath listing ["+filepath+"]");
+			LOG.warning(e.getMessage());
+		}
+		
+        // Convert listing to bytes
+        byte[] retBytes = new byte[length];
+        byte[] metBytes = urlListing.getBytes();      
+        ByteArrayInputStream is = new ByteArrayInputStream(metBytes);
+        is.skip(offset);
+        is.read(retBytes, 0, length);
+        
+        return retBytes;
+	}
+
+	/**
+	 * Returns a new-line separated list of URLs for all files located under the given filepath
+	 * 
+	 * @param filePath the absolute path to a root-directory to get a product listing for
+	 * @return a string containing a new-line separated list of URLs
+	 * @throws ProductException
+	 */
+	private String getURLListing(String filePath) throws ProductException, 
+			IllegalArgumentException {     
+		
+		// crawl and collect all files (including within subdirs) under filepath
+		File[] fileListing = getListing(filePath);
+		 
+		// convert each crawled file's path into an OFSN download link
+		StringBuilder stringBuilder = new StringBuilder();
+		for (int i=0; i < fileListing.length; i++) {
+			File file = (File) fileListing[i];
+			stringBuilder.append(buildOFSNURL(file).toString());
+			stringBuilder.append("\n");
+		}
+		
+    	return stringBuilder.toString();
+	}
+	
+	/**
+	 * Returns a URL object representing the URL associated with this particular product file.
+	 * 
+	 * The URL is defined to have items such as: hostname, server port, server context root,
+	 * and return type configured based upon a product server configuration file
+	 * 
+	 * @param file the product file
+	 * @return a URL
+	 */
+	private URL buildOFSNURL(File file) {
+		URL url = null;
+		
+		String fileRelativePath = file.getAbsolutePath().substring(this.productRoot.length());
+		
+		// construct a URL for the file, optionally using a port if available
+		String ofsnPath;
+		if (this.prodServerPort != null) {
+			if (!this.prodServerPort.isEmpty()) {
+				ofsnPath = "http://" + this.prodServerHostname 
+				+ ":" + this.prodServerPort + "/" + this.prodServerContext 
+				+ "/prod?q=OFSN=" + fileRelativePath + "+AND+RT%3D" + this.returnType;
+			} else {
+				ofsnPath = "http://" + this.prodServerHostname 
+				+ "/" + this.prodServerContext + "/prod?q=OFSN=" + fileRelativePath 
+				+ "+AND+RT%3D" + this.returnType;
+			}
+		} else {
+			ofsnPath = "http://" + this.prodServerHostname 
+			+ "/" + this.prodServerContext + "/prod?q=OFSN=" + fileRelativePath 
+			+ "+AND+RT%3D" + this.returnType;
+		}
+		
+		try {
+			url = new URL(ofsnPath);
+		} catch (MalformedURLException e) {
+			LOG.warning(e.getMessage());
+		}
+		
+		return url;
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.apache.oodt.product.handlers.ofsn.OFSNGetHandler#sizeOf(java.lang.String)
+	 */
+	public long sizeOf(String filepath) {
+		String urlListing = DEFAULT_RETURN_VALUE;
+		try {
+			urlListing = getURLListing(filepath);
+		} catch (ProductException e) {
+			LOG.warning("Unable to obtain size information for filepath listing ["+filepath+"]");
+			LOG.warning(e.getMessage());
+		} catch (IllegalArgumentException e) {
+			LOG.warning("Unable to obtain size information for filepath listing ["+filepath+"]");
+			LOG.warning(e.getMessage());
+		}
+		
+		return urlListing.getBytes().length;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.apache.oodt.product.handlers.ofsn.AbstractCrawlLister#getListing(java.lang.String)
+	 */
+	public File[] getListing(String filePath) throws ProductException, 
+			IllegalArgumentException {
+		return crawlFiles(new File(filePath), true, false);
+	} 
+
+}
\ No newline at end of file