📄 atomservlet.java
字号:
/* * Copyright 2005 David M Johnson (For RSS and Atom In Action) * * 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.roller.presentation.atomapi;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.Reader;import java.io.Writer;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;import org.jdom.output.Format;import org.jdom.output.XMLOutputter;import org.roller.util.Utilities;import com.sun.syndication.feed.atom.Entry;import com.sun.syndication.feed.atom.Feed;import com.sun.syndication.feed.atom.Link;import com.sun.syndication.io.FeedException;import com.sun.syndication.io.WireFeedInput;import com.sun.syndication.io.WireFeedOutput;/** * Atom Servlet implements Atom by calling a Roller independent handler. * @web.servlet name="AtomServlet" * @web.servlet-mapping url-pattern="/atom/*" * @author David M Johnson */public class AtomServlet extends HttpServlet{ /** We use Rome to parse/generate Atom feeds and it does Atom format 0.3 */ public static final String FEED_TYPE = "atom_0.3"; private static Log mLogger = LogFactory.getFactory().getInstance(AtomServlet.class); //----------------------------------------------------------------------------- /** * Create an Atom request handler. * TODO: make AtomRequestHandler implementation configurable. */ private AtomHandler createAtomRequestHandler(HttpServletRequest request) { return new RollerAtomHandler(request); } //----------------------------------------------------------------------------- /** * Handles an Atom GET by calling handler and writing results to response. */ protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { AtomHandler handler = createAtomRequestHandler(req); String userName = handler.getAuthenticatedUsername(); if (userName != null) { String[] pathInfo = getPathInfo(req); try { if (handler.isIntrospectionURI(pathInfo)) { // return an Atom Service document AtomService service = handler.getIntrospection(pathInfo); Document doc = AtomService.serviceToDocument(service); Writer writer = res.getWriter(); XMLOutputter outputter = new XMLOutputter(); outputter.setFormat(Format.getPrettyFormat()); outputter.output(doc, writer); writer.close(); res.setStatus(HttpServletResponse.SC_OK); } else if (handler.isCollectionURI(pathInfo)) { // return a collection String ranges = req.getHeader("Range"); if (ranges == null) req.getParameter("Range"); AtomCollection col = null; if (ranges != null) { AtomCollection.Range range = AtomCollection.parseRange(req.getHeader("Range")); int offset = 0; String offsetString = req.getParameter("offset"); if (offsetString != null) { offset = Integer.parseInt(offsetString); } col= handler.getCollection( pathInfo, range.start, range.end, offset); } else { col= handler.getCollection(pathInfo); } Document doc = AtomCollection.collectionToDocument(col); Writer writer = res.getWriter(); XMLOutputter outputter = new XMLOutputter(); outputter.setFormat(Format.getPrettyFormat()); outputter.output(doc, writer); writer.close(); res.setStatus(HttpServletResponse.SC_OK); } else if (handler.isEntryURI(pathInfo)) { // return an entry Entry entry = handler.getEntry(pathInfo); Writer writer = res.getWriter(); serializeEntry(entry, writer); writer.close(); } else if (handler.isResourceURI(pathInfo)) { // return a resource String absPath = handler.getResourceFilePath(pathInfo); String type = getServletContext().getMimeType(absPath); res.setContentType(type); Utilities.copyInputToOutput( new FileInputStream(absPath), res.getOutputStream()); } else { res.setStatus(HttpServletResponse.SC_NOT_FOUND); } } catch (Exception e) { res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); e.printStackTrace(res.getWriter()); mLogger.error(e); } } else { res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); } } //----------------------------------------------------------------------------- /** * Handles an Atom POST by calling handler to identify URI, reading/parsing * data, calling handler and writing results to response. */ protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { AtomHandler handler = createAtomRequestHandler(req); String userName = handler.getAuthenticatedUsername(); if (userName != null) { String[] pathInfo = getPathInfo(req); try { if (handler.isEntryCollectionURI(pathInfo)) { // parse incoming entry Entry unsavedEntry = parseEntry( new InputStreamReader(req.getInputStream())); // call handler to post it Entry savedEntry = handler.postEntry(pathInfo, unsavedEntry); Iterator links = savedEntry.getAlternateLinks().iterator(); while (links.hasNext()) { Link link = (Link) links.next(); if (link.getRel().equals("alternate")) { res.addHeader("Location", link.getHref()); break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -