I hacked up a very simple RSDServlet which uses velocity and I am willing to commit
it if everyone is in agreement. This will add a new servlet mapped to /rsd/*, so
that you can get the rsd for a weblog via /rsd/<handle>.
Here's the code if anyone really wants to take a look ...
public class RSDServlet extends VelocityServlet {
private static Log mLogger = LogFactory.getLog(RSDServlet.class);
/**
* Process a request for an rsd file.
*/
public Template handleRequest(HttpServletRequest request,
HttpServletResponse response,
Context ctx)
throws IOException {
Template template = null;
WeblogRequest weblogRequest = null;
WebsiteData weblog = null;
// first off lets parse the incoming request and validate it
try {
weblogRequest = new WeblogRequest(request);
// now make sure the specified weblog really exists
UserManager userMgr = RollerFactory.getRoller().getUserManager();
weblog =
userMgr.getWebsiteByHandle(weblogRequest.getWeblogHandle(), Boolean.TRUE);
} catch(InvalidRequestException ire) {
// An error initializing the request is considered to be a 404
response.sendError(HttpServletResponse.SC_NOT_FOUND);
request.setAttribute("DisplayException", ire);
mLogger.error("Bad Request: "+ire.getMessage());
return null;
} catch(RollerException re) {
// error looking up the weblog, we assume it doesn't exist
response.sendError(HttpServletResponse.SC_NOT_FOUND);
request.setAttribute("DisplayException", re);
mLogger.warn("Unable to lookup weblog ["+
weblogRequest.getWeblogHandle()+"] "+re.getMessage());
return null;
}
// request appears to be valid, lets render
try {
// setup context
ctx.put("website", weblog);
RollerContext rollerContext = new RollerContext();
ctx.put("absBaseURL", rollerContext.getAbsoluteContextUrl(request));
// lookup our rsd template
template = getTemplate("/flavors/rsd.vm");
// make sure response content type is properly set
response.setContentType("application/rsd+xml");
} catch(ResourceNotFoundException rnfe ) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
request.setAttribute("DisplayException", rnfe);
mLogger.warn("ResourceNotFound: "+ request.getRequestURL());
mLogger.debug(rnfe);
} catch(Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
request.setAttribute("DisplayException", e);
mLogger.error("Unexpected exception", e);
}
return template;
}
}
and the rsd.vm file ...
<rsd version="1.0">
<service>
<engineName>Roller Weblogger</engineName>
<engineLink>http://www.rollerweblogger.org/</engineLink>
<homePageLink>${absBaseURL}/page/${website.handle}/</homePageLink>
<apis>
<api name="blogger" preferred="false"
apiLink="${absBaseURL}/xmlrpc"
blogID="${website.handle}"/>
<api name="metaWeblog" preferred="true"
apiLink="${absBaseURL}/xmlrpc"
blogID="${website.handle}"/>
</apis>
</service>
</rsd>
-- Allen
On Wed, 2005-12-14 at 20:46, Sean Gilligan wrote:
Allen Gilliland wrote:
I don't think the patch came through because I'm guessing the mailing
list is stripping all attachments :/
I attached the patch to ROL-930 in JIRA:
http://opensource2.atlassian.com/projects/roller/browse/ROL-930
rather than to the mailing list.
Also, I want to be fairly careful about the decision to just add the RSD
support to the FlavorServlet. I still prefer the RSD servlet idea.
I think the RSDServlet idea makes sense, but I'm a Roller beginner and
have no real experience with Struts. (I'm migrating my web-layer skills
from Turbine to SpringMVC)
In any event, someone could commit the patch I've submitted and that
would enable RSD and update the theme templates. Separately (and
hopefully before 2.1) someone could create an RSDServlet (or
RSDController, etc.) as a more lightweight solution.
I'm willing to write the RSDServlet (or controller/action) if that's
what people decide is necessary to get the RSD patch committed, but I'm
a little hesitant to dive into Roller web.xml/struts/web configuration
if I can avoid it ;)
-- Sean