<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
  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.
-->

<!DOCTYPE web-app 
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>


    <!-- General description of your web application -->

    <display-name>HDFS Proxy</display-name>
    <description>
      get data from grid 
    </description>


    <!-- Context initialization parameters that define shared
         String constants used within your application, which
         can be customized by the system administrator who is
         installing your application.  The values actually
         assigned to these parameters can be retrieved in a
         servlet or JSP page by calling:

             String value =
               getServletContext().getInitParameter("name");

         where "name" matches the <param-name> element of
         one of these initialization parameters.

         You can define any number of context initialization
         parameters, including zero.
    -->

    <context-param>
      <param-name>webmaster</param-name>
      <param-value>zhiyong1@yahoo-inc.com</param-value>
      <description>
        The EMAIL address of the administrator to whom questions
        and comments about this application should be addressed.
      </description>
    </context-param>
    
     	


    <!-- Servlet definitions for the servlets that make up
         your web application, including initialization
         parameters.  With Tomcat, you can also send requests
         to servlets not listed here with a request like this:

           http://localhost:8080/{context-path}/servlet/{classname}

         but this usage is not guaranteed to be portable.  It also
         makes relative references to images and other resources
         required by your servlet more complicated, so defining
         all of your servlets (and defining a mapping to them with
         a servlet-mapping element) is recommended.

         Servlet initialization parameters can be retrieved in a
         servlet or JSP page by calling:

             String value =
               getServletConfig().getInitParameter("name");

         where "name" matches the <param-name> element of
         one of these initialization parameters.

         You can define any number of servlets, including zero.
    -->

		 <filter>
	        <filter-name>proxyFilter</filter-name>
	        <filter-class>org.apache.hadoop.hdfsproxy.ProxyFilter</filter-class>
	   </filter>

    <filter-mapping>
        <filter-name>proxyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <servlet>
    	<servlet-name>listPaths</servlet-name>
      <description>list paths data access</description>
      <servlet-class>org.apache.hadoop.hdfsproxy.ProxyListPathsServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>listPaths</servlet-name>
        <url-pattern>/listPaths/*</url-pattern>
    </servlet-mapping>

		<servlet>
    	<servlet-name>data</servlet-name>
      <description>data access</description>
      <servlet-class>org.apache.hadoop.hdfsproxy.ProxyFileDataServlet</servlet-class>
    </servlet>
    
	  <servlet-mapping>
        <servlet-name>data</servlet-name>
        <url-pattern>/data/*</url-pattern>
    </servlet-mapping>
    
    <servlet>
    	<servlet-name>streamFile</servlet-name>
      <description>stream file access</description>
      <servlet-class>org.apache.hadoop.hdfsproxy.ProxyStreamFile</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>streamFile</servlet-name>
        <url-pattern>/streamFile/*</url-pattern>
    </servlet-mapping>
    

		<welcome-file-list>
		  <welcome-file>index.html</welcome-file>
		</welcome-file-list>

    <!-- Define the default session timeout for your application,
         in minutes.  From a servlet or JSP page, you can modify
         the timeout for a particular session dynamically by using
         HttpSession.getMaxInactiveInterval(). -->

    <session-config>
      <session-timeout>30</session-timeout>    <!-- 30 minutes -->
    </session-config>    


</web-app>








