1   /*
2    * Copyright 2004 Sun Microsystems, Inc.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   *
16   */
17  package com.sun.syndication.fetcher.impl;
18  
19  import java.io.BufferedReader;
20  import java.io.IOException;
21  import java.io.InputStream;
22  import java.io.InputStreamReader;
23  
24  import javax.servlet.ServletException;
25  import javax.servlet.http.HttpServletRequest;
26  import javax.servlet.http.HttpServletResponse;
27  
28  
29  public class FetcherTestServlet extends javax.servlet.http.HttpServlet {
30  
31  	/***
32  	 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
33  	 */
34  	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
35  		
36  		if ("TRUE".equalsIgnoreCase(request.getParameter("redirect"))) {
37  			//	testing redirection support			
38  			response.sendRedirect(request.getRequestURI());
39  			return;
40  		} else if (request.getParameter("error") != null) {
41  			//response.sendError(HttpServletResponse.SC_NOT_FOUND);	
42  			int errorToThrow = Integer.parseInt(request.getParameter("error"));
43  			response.sendError(errorToThrow);
44  			return;
45  		} else {
46  			
47  			// We manually set the date headers using strings
48  			// instead of the get/setDateHeader methods because
49  			// those methods return longs, which has too much
50  			// precision for the real date headers
51  			// this is just a random date
52  			String lastModifiedDate = "Thu, 08 Jan 2009 23:06:39 GMT"; 
53  			String eTag = "123456";
54  			
55  			if ("TRUE".equalsIgnoreCase(request.getParameter("refreshfeed"))) {
56  				lastModifiedDate = "Fri, 09 Jan 2009 12:06:39 GMT";
57  				eTag = "abcde"; 
58  			}
59  			
60  			boolean serveFeed = checkModified(request, lastModifiedDate, eTag);
61  			
62  			if (serveFeed) {
63  				sendFeedData(response, lastModifiedDate, eTag);
64  				return;					
65  			} else {
66  				response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
67  				return;							
68  			}
69  		}							
70  	}
71  
72  	private boolean checkModified(HttpServletRequest request, String lastModifiedDate, String eTag) {
73  		
74  		String requestedETag = request.getHeader("If-None-Match");			
75  		String requestedLastModified = request.getHeader("If-Modified-Since");
76  		boolean modified = true;
77  		boolean mustServer = false;			
78  		if (requestedETag != null) {
79  			if (eTag.equals(requestedETag)) {
80  				modified = false;
81  			} else {
82  				modified = true;
83  				mustServer = true;				
84  			}
85  		}
86  		if (requestedLastModified != null) {
87  			if (lastModifiedDate.equals(requestedLastModified)) {
88  				modified = false;
89  			} else {
90  				modified = true;
91  				mustServer = true;					
92  			}
93  		}
94  		boolean serveFeed = (modified || mustServer);
95  		return serveFeed;
96  	}
97  
98  	private void sendFeedData(HttpServletResponse response, String lastModifiedDate, String eTag) throws IOException {
99  		response.setContentType("text/xml");
100 		if (eTag != null) {
101 			response.setHeader("ETag", eTag);
102 		}		
103 		if (lastModifiedDate != null) {
104 			response.setHeader("Last-Modified", lastModifiedDate);
105 		}
106 		
107 		InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("/atom_0.3.xml");
108 		if (inputStream == null) {
109 		    inputStream = this.getClass().getResourceAsStream("/atom_0.3.xml");
110 		}
111 		
112 		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
113 		try {
114 			String line;
115 			while ((line = reader.readLine()) != null) {									
116 				//response.getWriter().println(line);
117 			    response.getOutputStream().write(line.getBytes());
118 				line = null;
119 			}
120 		} finally {
121 			if (reader != null) {
122 			    reader.close();
123 			}
124 		}
125 	}
126 }