Refactored project to use standard maven layout
Updated POM
This commit is contained in:
parent
4857e524d3
commit
a482dcb959
28 changed files with 257 additions and 298 deletions
66
pom.xml
66
pom.xml
|
@ -52,51 +52,29 @@
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
<repository>
|
<repository>
|
||||||
<id>central.staging</id>
|
<id>central.staging</id>
|
||||||
<name>Nexus Release Repository</name>
|
|
||||||
<url>http://oss.sonatype.org/service/local/staging/deploy/maven2</url>
|
<url>http://oss.sonatype.org/service/local/staging/deploy/maven2</url>
|
||||||
</repository>
|
</repository>
|
||||||
<snapshotRepository>
|
<snapshotRepository>
|
||||||
<id>sonatype.snapshots</id>
|
<id>sonatype.snapshots</id>
|
||||||
<name>My Nexus Snapshots Repository</name>
|
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||||
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
|
|
||||||
</snapshotRepository>
|
</snapshotRepository>
|
||||||
</distributionManagement>
|
</distributionManagement>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>sonatype.snapshots</id>
|
||||||
|
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<defaultGoal>install</defaultGoal>
|
|
||||||
<sourceDirectory>src/java</sourceDirectory>
|
|
||||||
<testSourceDirectory>src/test</testSourceDirectory>
|
|
||||||
<resources>
|
|
||||||
<resource>
|
|
||||||
<directory>src/java</directory>
|
|
||||||
<includes>
|
|
||||||
<include>**/*.properties</include>
|
|
||||||
</includes>
|
|
||||||
</resource>
|
|
||||||
</resources>
|
|
||||||
<testResources>
|
|
||||||
<testResource>
|
|
||||||
<directory>src/test</directory>
|
|
||||||
<includes>
|
|
||||||
<include>**/*.xml</include>
|
|
||||||
<include>**/*.properties</include>
|
|
||||||
</includes>
|
|
||||||
</testResource>
|
|
||||||
</testResources>
|
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-release-plugin</artifactId>
|
|
||||||
<version>2.4.1</version>
|
|
||||||
<configuration>
|
|
||||||
<mavenExecutorId>forked-path</mavenExecutorId>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
@ -106,22 +84,10 @@
|
||||||
<target>1.6</target>
|
<target>1.6</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/Abstract*.java</exclude>
|
|
||||||
<exclude>**/*Servlet.java</exclude>
|
|
||||||
</excludes>
|
|
||||||
<includes>
|
|
||||||
<include>**/*Test.java</include>
|
|
||||||
</includes>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<artifactId>maven-release-plugin</artifactId>
|
||||||
<version>2.6</version>
|
<version>2.4.1</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
@ -148,7 +114,6 @@
|
||||||
<version>2.2.1</version>
|
<version>2.2.1</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>attach-sources</id>
|
|
||||||
<goals>
|
<goals>
|
||||||
<goal>jar</goal>
|
<goal>jar</goal>
|
||||||
</goals>
|
</goals>
|
||||||
|
@ -161,7 +126,6 @@
|
||||||
<version>2.9.1</version>
|
<version>2.9.1</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>attach-javadocs</id>
|
|
||||||
<goals>
|
<goals>
|
||||||
<goal>jar</goal>
|
<goal>jar</goal>
|
||||||
</goals>
|
</goals>
|
||||||
|
@ -202,7 +166,7 @@
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.rometools</groupId>
|
<groupId>com.rometools</groupId>
|
||||||
<artifactId>rome</artifactId>
|
<artifactId>rome</artifactId>
|
||||||
<version>2.0.0-SNAPSHOT</version>
|
<version>2.0.0-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -212,42 +176,36 @@
|
||||||
<version>2.11.0</version>
|
<version>2.11.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<!-- Required at build time and to use HTTPClientFetcher -->
|
|
||||||
<groupId>commons-httpclient</groupId>
|
<groupId>commons-httpclient</groupId>
|
||||||
<artifactId>commons-httpclient</artifactId>
|
<artifactId>commons-httpclient</artifactId>
|
||||||
<version>3.1</version>
|
<version>3.1</version>
|
||||||
<optional />
|
<optional />
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<!-- Required at build time and to use HTTPClientFetcher -->
|
|
||||||
<groupId>commons-logging</groupId>
|
<groupId>commons-logging</groupId>
|
||||||
<artifactId>commons-logging</artifactId>
|
<artifactId>commons-logging</artifactId>
|
||||||
<version>1.1.3</version>
|
<version>1.1.3</version>
|
||||||
<optional />
|
<optional />
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<!-- Required at build time and to use HTTPClientFetcher -->
|
|
||||||
<groupId>commons-logging</groupId>
|
<groupId>commons-logging</groupId>
|
||||||
<artifactId>commons-logging-api</artifactId>
|
<artifactId>commons-logging-api</artifactId>
|
||||||
<version>1.1</version>
|
<version>1.1</version>
|
||||||
<optional />
|
<optional />
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<!-- Only required at compile time for testing -->
|
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>servlet-api</artifactId>
|
||||||
<version>2.5</version>
|
<version>2.5</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<!-- Only required at compile time for testing -->
|
|
||||||
<groupId>jetty</groupId>
|
<groupId>jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty</artifactId>
|
||||||
<version>4.2.12</version>
|
<version>4.2.12</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<!-- Only required at compile time for testing -->
|
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
<artifactId>junit</artifactId>
|
<artifactId>junit</artifactId>
|
||||||
<version>4.11</version>
|
<version>4.11</version>
|
||||||
|
|
245
src/test/java/org/rometools/test/FetcherTestServlet.java
Normal file
245
src/test/java/org/rometools/test/FetcherTestServlet.java
Normal file
|
@ -0,0 +1,245 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2004 Sun Microsystems, Inc.
|
||||||
|
*
|
||||||
|
* Licensed 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.rometools.test;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import com.sun.syndication.feed.synd.SyndContent;
|
||||||
|
import com.sun.syndication.feed.synd.SyndContentImpl;
|
||||||
|
import com.sun.syndication.feed.synd.SyndEntry;
|
||||||
|
import com.sun.syndication.feed.synd.SyndEntryImpl;
|
||||||
|
import com.sun.syndication.feed.synd.SyndFeed;
|
||||||
|
import com.sun.syndication.feed.synd.SyndFeedImpl;
|
||||||
|
import com.sun.syndication.io.FeedException;
|
||||||
|
import com.sun.syndication.io.SyndFeedOutput;
|
||||||
|
|
||||||
|
public class FetcherTestServlet extends HttpServlet {
|
||||||
|
|
||||||
|
public static final String ETAG_1 = "ETAG-1";
|
||||||
|
public static final String ETAG_2 = "ETAG-2";
|
||||||
|
|
||||||
|
public static final String DELTA_FEED_TITLE = "Delta Encoded Feed";
|
||||||
|
public static final String DELTA_FEED_ENTRY_TITLE = "Delta Encoded Feed Entry";
|
||||||
|
|
||||||
|
public static final String SERVLET_MAPPING = "/FetcherTestServlet/*";
|
||||||
|
public static final String SERVLET_MAPPING2 = "/FetcherTestServlet2/*";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws IOException
|
||||||
|
* @throws
|
||||||
|
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
|
||||||
|
|
||||||
|
if ("TRUE".equalsIgnoreCase(request.getParameter("redirect"))) {
|
||||||
|
// testing redirection support
|
||||||
|
response.sendRedirect("/rome/FetcherTestServlet2/");
|
||||||
|
return;
|
||||||
|
} else if (request.getParameter("error") != null) {
|
||||||
|
// response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
||||||
|
final int errorToThrow = Integer.parseInt(request.getParameter("error"));
|
||||||
|
response.sendError(errorToThrow);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// We manually set the date headers using strings
|
||||||
|
// instead of the get/setDateHeader methods because
|
||||||
|
// those methods return longs, which has too much
|
||||||
|
// precision for the real date headers
|
||||||
|
// this is just a random date
|
||||||
|
String lastModifiedDate = "Thu, 08 Jan 2009 23:06:39 GMT";
|
||||||
|
String eTag = ETAG_1;
|
||||||
|
|
||||||
|
if ("TRUE".equalsIgnoreCase(request.getParameter("refreshfeed"))) {
|
||||||
|
lastModifiedDate = "Fri, 09 Jan 2009 12:06:39 GMT";
|
||||||
|
eTag = ETAG_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean serveFeed = checkModified(request, lastModifiedDate, eTag) || "TRUE".equalsIgnoreCase(request.getParameter("deltaencode"));
|
||||||
|
final boolean gzip = "TRUE".equalsIgnoreCase(request.getParameter("gzipfeed"));
|
||||||
|
|
||||||
|
if (serveFeed) {
|
||||||
|
final String aimHeader = request.getHeader("A-IM");
|
||||||
|
final boolean serveDeltaEncodedFeed = aimHeader != null && aimHeader.indexOf("feed") >= 0
|
||||||
|
&& "TRUE".equalsIgnoreCase(request.getParameter("deltaencode"));
|
||||||
|
if (serveDeltaEncodedFeed) {
|
||||||
|
try {
|
||||||
|
sendDeltaEncodedData(response, lastModifiedDate, request.getHeader("If-None-Match"), eTag, gzip);
|
||||||
|
} catch (final FeedException e) {
|
||||||
|
throw new ServletException(e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sendFeedData(response, lastModifiedDate, eTag, gzip);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkModified(final HttpServletRequest request, final String lastModifiedDate, final String eTag) {
|
||||||
|
|
||||||
|
final String requestedETag = request.getHeader("If-None-Match");
|
||||||
|
final String requestedLastModified = request.getHeader("If-Modified-Since");
|
||||||
|
boolean modified = true;
|
||||||
|
boolean mustServer = false;
|
||||||
|
if (requestedETag != null) {
|
||||||
|
if (eTag.equals(requestedETag)) {
|
||||||
|
modified = false;
|
||||||
|
} else {
|
||||||
|
modified = true;
|
||||||
|
mustServer = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (requestedLastModified != null) {
|
||||||
|
if (lastModifiedDate.equals(requestedLastModified)) {
|
||||||
|
modified = false;
|
||||||
|
} else {
|
||||||
|
modified = true;
|
||||||
|
mustServer = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final boolean serveFeed = modified || mustServer;
|
||||||
|
return serveFeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param request
|
||||||
|
* @param lastModifiedDate
|
||||||
|
* @param tag
|
||||||
|
* @param gzip
|
||||||
|
* @throws IOException
|
||||||
|
* @throws FeedException
|
||||||
|
*/
|
||||||
|
private void sendDeltaEncodedData(final HttpServletResponse response, final String lastModifiedDate, final String requestedETag, final String responseETag,
|
||||||
|
final boolean gzip) throws IOException, FeedException {
|
||||||
|
if (ETAG_1.equals(requestedETag) || ETAG_2.equals(requestedETag)) {
|
||||||
|
OutputStream out = null;
|
||||||
|
if (gzip) {
|
||||||
|
response.setHeader("Content-Encoding", "gzip");
|
||||||
|
out = new GZIPOutputStream(response.getOutputStream());
|
||||||
|
} else {
|
||||||
|
out = response.getOutputStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
response.setContentType("text/xml");
|
||||||
|
response.setStatus(226);
|
||||||
|
if (gzip) {
|
||||||
|
response.setHeader("IM", "feed, gzip");
|
||||||
|
} else {
|
||||||
|
response.setHeader("IM", "feed");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (responseETag != null) {
|
||||||
|
response.setHeader("ETag", responseETag);
|
||||||
|
}
|
||||||
|
if (lastModifiedDate != null) {
|
||||||
|
response.setHeader("Last-Modified", lastModifiedDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
final SyndFeed feed = new SyndFeedImpl();
|
||||||
|
feed.setFeedType("atom_1.0");
|
||||||
|
|
||||||
|
feed.setTitle(DELTA_FEED_TITLE);
|
||||||
|
feed.setLink("http://rome.dev.java.net");
|
||||||
|
feed.setDescription("This tests using rfc3229 delta encoding.");
|
||||||
|
|
||||||
|
final List entries = new ArrayList();
|
||||||
|
SyndEntry entry;
|
||||||
|
SyndContent description;
|
||||||
|
|
||||||
|
entry = new SyndEntryImpl();
|
||||||
|
entry.setTitle(DELTA_FEED_ENTRY_TITLE);
|
||||||
|
entry.setLink("http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html");
|
||||||
|
try {
|
||||||
|
final DateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
|
entry.setPublishedDate(dateParser.parse("2004-11-25"));
|
||||||
|
} catch (final ParseException ex) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
description = new SyndContentImpl();
|
||||||
|
description.setType("text/plain");
|
||||||
|
description.setValue("Test for RFC3229 Delta Encoding");
|
||||||
|
entry.setDescription(description);
|
||||||
|
entries.add(entry);
|
||||||
|
|
||||||
|
feed.setEntries(entries);
|
||||||
|
|
||||||
|
final SyndFeedOutput output = new SyndFeedOutput();
|
||||||
|
output.output(feed, new OutputStreamWriter(out));
|
||||||
|
} else {
|
||||||
|
sendFeedData(response, lastModifiedDate, responseETag, gzip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendFeedData(final HttpServletResponse response, final String lastModifiedDate, final String eTag, final boolean gzip) throws IOException {
|
||||||
|
OutputStream out = null;
|
||||||
|
if (gzip) {
|
||||||
|
response.setHeader("Content-Encoding", "gzip");
|
||||||
|
out = new GZIPOutputStream(response.getOutputStream());
|
||||||
|
} else {
|
||||||
|
out = response.getOutputStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
response.setContentType("text/xml");
|
||||||
|
if (eTag != null) {
|
||||||
|
response.setHeader("ETag", eTag);
|
||||||
|
}
|
||||||
|
if (lastModifiedDate != null) {
|
||||||
|
response.setHeader("Last-Modified", lastModifiedDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("/atom_1.0.xml");
|
||||||
|
if (inputStream == null) {
|
||||||
|
inputStream = this.getClass().getResourceAsStream("/atom_1.0.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
final BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
|
||||||
|
try {
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
out.write(line.getBytes());
|
||||||
|
line = null;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (reader != null) {
|
||||||
|
reader.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,244 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2004 Sun Microsystems, Inc.
|
|
||||||
*
|
|
||||||
* Licensed 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.rometools.test;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.io.OutputStreamWriter;
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.text.ParseException;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.zip.GZIPOutputStream;
|
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import com.sun.syndication.feed.synd.SyndContent;
|
|
||||||
import com.sun.syndication.feed.synd.SyndContentImpl;
|
|
||||||
import com.sun.syndication.feed.synd.SyndEntry;
|
|
||||||
import com.sun.syndication.feed.synd.SyndEntryImpl;
|
|
||||||
import com.sun.syndication.feed.synd.SyndFeed;
|
|
||||||
import com.sun.syndication.feed.synd.SyndFeedImpl;
|
|
||||||
import com.sun.syndication.io.FeedException;
|
|
||||||
import com.sun.syndication.io.SyndFeedOutput;
|
|
||||||
|
|
||||||
|
|
||||||
public class FetcherTestServlet extends javax.servlet.http.HttpServlet {
|
|
||||||
public static final String ETAG_1 = "ETAG-1";
|
|
||||||
public static final String ETAG_2 = "ETAG-2";
|
|
||||||
|
|
||||||
public static final String DELTA_FEED_TITLE = "Delta Encoded Feed";
|
|
||||||
public static final String DELTA_FEED_ENTRY_TITLE = "Delta Encoded Feed Entry";
|
|
||||||
|
|
||||||
public static final String SERVLET_MAPPING = "/FetcherTestServlet/*";
|
|
||||||
public static final String SERVLET_MAPPING2 = "/FetcherTestServlet2/*";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @throws IOException
|
|
||||||
* @throws
|
|
||||||
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
|
||||||
*/
|
|
||||||
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
|
||||||
|
|
||||||
if ("TRUE".equalsIgnoreCase(request.getParameter("redirect"))) {
|
|
||||||
// testing redirection support
|
|
||||||
response.sendRedirect("/rome/FetcherTestServlet2/");
|
|
||||||
return;
|
|
||||||
} else if (request.getParameter("error") != null) {
|
|
||||||
//response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
|
||||||
int errorToThrow = Integer.parseInt(request.getParameter("error"));
|
|
||||||
response.sendError(errorToThrow);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// We manually set the date headers using strings
|
|
||||||
// instead of the get/setDateHeader methods because
|
|
||||||
// those methods return longs, which has too much
|
|
||||||
// precision for the real date headers
|
|
||||||
// this is just a random date
|
|
||||||
String lastModifiedDate = "Thu, 08 Jan 2009 23:06:39 GMT";
|
|
||||||
String eTag = ETAG_1;
|
|
||||||
|
|
||||||
if ("TRUE".equalsIgnoreCase(request.getParameter("refreshfeed"))) {
|
|
||||||
lastModifiedDate = "Fri, 09 Jan 2009 12:06:39 GMT";
|
|
||||||
eTag = ETAG_2;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean serveFeed = checkModified(request, lastModifiedDate, eTag) || ("TRUE".equalsIgnoreCase(request.getParameter("deltaencode")));
|
|
||||||
boolean gzip = "TRUE".equalsIgnoreCase(request.getParameter("gzipfeed"));
|
|
||||||
|
|
||||||
if (serveFeed) {
|
|
||||||
String aimHeader = request.getHeader("A-IM");
|
|
||||||
boolean serveDeltaEncodedFeed = ((aimHeader != null) && (aimHeader.indexOf("feed") >=0) && "TRUE".equalsIgnoreCase(request.getParameter("deltaencode")));
|
|
||||||
if (serveDeltaEncodedFeed) {
|
|
||||||
try {
|
|
||||||
sendDeltaEncodedData(response, lastModifiedDate, request.getHeader("If-None-Match"), eTag, gzip);
|
|
||||||
} catch (FeedException e) {
|
|
||||||
throw new ServletException(e);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sendFeedData(response, lastModifiedDate, eTag, gzip);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
response.sendError(HttpServletResponse.SC_NOT_MODIFIED);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private boolean checkModified(HttpServletRequest request, String lastModifiedDate, String eTag) {
|
|
||||||
|
|
||||||
String requestedETag = request.getHeader("If-None-Match");
|
|
||||||
String requestedLastModified = request.getHeader("If-Modified-Since");
|
|
||||||
boolean modified = true;
|
|
||||||
boolean mustServer = false;
|
|
||||||
if (requestedETag != null) {
|
|
||||||
if (eTag.equals(requestedETag)) {
|
|
||||||
modified = false;
|
|
||||||
} else {
|
|
||||||
modified = true;
|
|
||||||
mustServer = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (requestedLastModified != null) {
|
|
||||||
if (lastModifiedDate.equals(requestedLastModified)) {
|
|
||||||
modified = false;
|
|
||||||
} else {
|
|
||||||
modified = true;
|
|
||||||
mustServer = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boolean serveFeed = (modified || mustServer);
|
|
||||||
return serveFeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param request
|
|
||||||
* @param lastModifiedDate
|
|
||||||
* @param tag
|
|
||||||
* @param gzip
|
|
||||||
* @throws IOException
|
|
||||||
* @throws FeedException
|
|
||||||
*/
|
|
||||||
private void sendDeltaEncodedData(HttpServletResponse response, String lastModifiedDate, String requestedETag, String responseETag, boolean gzip) throws IOException, FeedException {
|
|
||||||
if (ETAG_1.equals(requestedETag) || ETAG_2.equals(requestedETag)) {
|
|
||||||
OutputStream out = null;
|
|
||||||
if (gzip) {
|
|
||||||
response.setHeader("Content-Encoding", "gzip");
|
|
||||||
out = new GZIPOutputStream(response.getOutputStream());
|
|
||||||
} else {
|
|
||||||
out = response.getOutputStream();
|
|
||||||
}
|
|
||||||
|
|
||||||
response.setContentType("text/xml");
|
|
||||||
response.setStatus(226);
|
|
||||||
if (gzip) {
|
|
||||||
response.setHeader("IM", "feed, gzip");
|
|
||||||
} else {
|
|
||||||
response.setHeader("IM", "feed");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (responseETag != null) {
|
|
||||||
response.setHeader("ETag", responseETag);
|
|
||||||
}
|
|
||||||
if (lastModifiedDate != null) {
|
|
||||||
response.setHeader("Last-Modified", lastModifiedDate);
|
|
||||||
}
|
|
||||||
|
|
||||||
SyndFeed feed = new SyndFeedImpl();
|
|
||||||
feed.setFeedType("atom_1.0");
|
|
||||||
|
|
||||||
feed.setTitle(DELTA_FEED_TITLE);
|
|
||||||
feed.setLink("http://rome.dev.java.net");
|
|
||||||
feed.setDescription("This tests using rfc3229 delta encoding.");
|
|
||||||
|
|
||||||
List entries = new ArrayList();
|
|
||||||
SyndEntry entry;
|
|
||||||
SyndContent description;
|
|
||||||
|
|
||||||
entry = new SyndEntryImpl();
|
|
||||||
entry.setTitle(DELTA_FEED_ENTRY_TITLE);
|
|
||||||
entry.setLink("http://bobwyman.pubsub.com/main/2004/09/using_rfc3229_w.html");
|
|
||||||
try {
|
|
||||||
DateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd");
|
|
||||||
entry.setPublishedDate(dateParser.parse("2004-11-25"));
|
|
||||||
}
|
|
||||||
catch (ParseException ex) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
description = new SyndContentImpl();
|
|
||||||
description.setType("text/plain");
|
|
||||||
description.setValue("Test for RFC3229 Delta Encoding");
|
|
||||||
entry.setDescription(description);
|
|
||||||
entries.add(entry);
|
|
||||||
|
|
||||||
feed.setEntries(entries);
|
|
||||||
|
|
||||||
SyndFeedOutput output = new SyndFeedOutput();
|
|
||||||
output.output(feed, new OutputStreamWriter(out));
|
|
||||||
} else {
|
|
||||||
sendFeedData(response, lastModifiedDate, responseETag, gzip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendFeedData(HttpServletResponse response, String lastModifiedDate, String eTag, boolean gzip) throws IOException {
|
|
||||||
OutputStream out = null;
|
|
||||||
if (gzip) {
|
|
||||||
response.setHeader("Content-Encoding", "gzip");
|
|
||||||
out = new GZIPOutputStream(response.getOutputStream());
|
|
||||||
} else {
|
|
||||||
out = response.getOutputStream();
|
|
||||||
}
|
|
||||||
|
|
||||||
response.setContentType("text/xml");
|
|
||||||
if (eTag != null) {
|
|
||||||
response.setHeader("ETag", eTag);
|
|
||||||
}
|
|
||||||
if (lastModifiedDate != null) {
|
|
||||||
response.setHeader("Last-Modified", lastModifiedDate);
|
|
||||||
}
|
|
||||||
|
|
||||||
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("/atom_1.0.xml");
|
|
||||||
if (inputStream == null) {
|
|
||||||
inputStream = this.getClass().getResourceAsStream("/atom_1.0.xml");
|
|
||||||
}
|
|
||||||
|
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
|
|
||||||
try {
|
|
||||||
String line;
|
|
||||||
while ((line = reader.readLine()) != null) {
|
|
||||||
out.write(line.getBytes());
|
|
||||||
line = null;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
if (reader != null) {
|
|
||||||
reader.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue