1 16 package org.outerj.daisy.frontend; 17 18 import org.apache.cocoon.generation.Generator; 19 import org.apache.cocoon.ProcessingException; 20 import org.apache.cocoon.environment.SourceResolver; 21 import org.apache.cocoon.environment.ObjectModelHelper; 22 import org.apache.cocoon.environment.Request; 23 import org.apache.cocoon.xml.XMLConsumer; 24 import org.apache.avalon.framework.parameters.Parameters; 25 import org.apache.avalon.framework.parameters.ParameterException; 26 import org.apache.avalon.framework.service.Serviceable; 27 import org.apache.avalon.framework.service.ServiceManager; 28 import org.apache.avalon.framework.service.ServiceException; 29 import org.apache.xmlbeans.XmlObject; 30 import org.xml.sax.SAXException ; 31 import org.xml.sax.helpers.AttributesImpl ; 32 import org.outerj.daisy.repository.Repository; 33 import org.outerj.daisy.repository.clientimpl.infrastructure.DaisyPropagatedException; 34 import org.outerj.daisy.repository.query.QueryManager; 35 36 import java.io.IOException ; 37 import java.util.Map ; 38 import java.util.Locale ; 39 40 public class QueryGenerator implements Generator, Serviceable { 41 private XMLConsumer consumer; 42 private String query; 43 private ServiceManager serviceManager; 44 private Map objectModel; 45 46 public void setup(SourceResolver sourceResolver, Map objectModel, String source, Parameters parameters) throws ProcessingException, SAXException , IOException { 47 try { 48 query = parameters.getParameter("query"); 49 } catch (ParameterException e) { 50 throw new ProcessingException(e); 51 } 52 this.objectModel = objectModel; 53 } 54 55 public void setConsumer(XMLConsumer xmlConsumer) { 56 this.consumer = xmlConsumer; 57 } 58 59 public void service(ServiceManager serviceManager) throws ServiceException { 60 this.serviceManager = serviceManager; 61 } 62 63 public void generate() throws IOException , SAXException , ProcessingException { 64 XmlObject result = null; 65 try { 66 Request request = ObjectModelHelper.getRequest(objectModel); 67 Repository repository = WikiHelper.getRepository(request, serviceManager); 68 QueryManager queryManager = repository.getQueryManager(); 69 Locale locale = (Locale )request.getLocale(); 70 result = queryManager.performQuery(query, locale); 71 } catch (Exception e) { 72 handleException(e); 73 return; 74 } 75 76 result.save(consumer, consumer); 77 } 78 79 private void handleException(Exception e) throws SAXException { 80 consumer.startDocument(); 81 AttributesImpl attrs = new AttributesImpl (); 82 attrs.addAttribute("", "class", "class", "CDATA", "daisy-error"); 83 consumer.startElement("", "p", "p", attrs); 84 insertString("Could not perform the following query:"); 85 insertBr(); 86 insertString(query); 87 insertBr(); 88 insertString("Encountered the following errors:"); 89 insertBr(); 90 insertString(getExceptionMessage(e)); 91 Throwable cause = e.getCause(); 92 while (cause != null) { 93 insertBr(); 94 insertString(getExceptionMessage(cause)); 95 cause = cause.getCause(); 96 } 97 consumer.endElement("", "p", "p"); 98 consumer.endDocument(); 99 } 100 101 private String getExceptionMessage(Throwable e) { 102 if (e instanceof DaisyPropagatedException) 103 return ((DaisyPropagatedException)e).getUserMessage(); 104 else 105 return e.getMessage(); 106 } 107 108 private void insertBr() throws SAXException { 109 consumer.startElement("", "br", "br", new AttributesImpl ()); 110 consumer.endElement("", "br", "br"); 111 } 112 113 private void insertString(String message) throws SAXException { 114 if (message == null) 115 message = "null"; 116 consumer.characters(message.toCharArray(), 0, message.length()); 117 } 118 } 119 | Popular Tags |