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

Reply via email to