<?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 WAR</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>
    
    <filter>
	   	<filter-name>ldapIpDirFilter</filter-name>
	   	<filter-class>org.apache.hadoop.hdfsproxy.LdapIpDirFilter</filter-class>
    </filter>

    <filter>
	   	<filter-name>authroizationFilter</filter-name>
	   	<filter-class>org.apache.hadoop.hdfsproxy.KerberosAuthorizationFilter</filter-class>
    </filter>

	<filter-mapping>
        <filter-name>ldapIpDirFilter</filter-name>
	    <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

    <filter-mapping>
        <filter-name>authroizationFilter</filter-name>
	    <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    	

    <!-- 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.
    -->

    
    <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>








