1 16 package org.outerj.daisy.navigation.impl; 17 18 import org.mortbay.http.handler.AbstractHttpHandler; 19 import org.mortbay.http.HttpRequest; 20 import org.mortbay.http.HttpResponse; 21 import org.mortbay.http.HttpException; 22 import org.apache.avalon.framework.service.Serviceable; 23 import org.apache.avalon.framework.service.ServiceManager; 24 import org.apache.avalon.framework.service.ServiceException; 25 import org.apache.avalon.framework.activity.Disposable; 26 import org.apache.avalon.framework.activity.Initializable; 27 import org.apache.avalon.framework.logger.LogEnabled; 28 import org.apache.avalon.framework.logger.Logger; 29 import org.apache.xmlbeans.XmlOptions; 30 import org.outerj.daisy.httpconnector.*; 31 import org.outerj.daisy.repository.Repository; 32 import org.outerj.daisy.repository.VariantKey; 33 import org.outerj.daisy.navigation.*; 34 import org.outerj.daisy.xmlutil.XmlSerializer; 35 import org.outerj.daisy.xmlutil.LocalSAXParserFactory; 36 37 import java.io.IOException ; 38 import java.io.ByteArrayOutputStream ; 39 import org.xml.sax.ContentHandler ; 40 import org.outerx.daisy.x10Navigationspec.NavigationLookupDocument; 41 42 48 public class NavigationHttpConnector implements Serviceable, Initializable, Disposable, LogEnabled { 49 private HttpConnector httpConnector; 50 private NavigationHttpHandler httpHandler = new NavigationHttpHandler(); 51 private Logger requestErrorLogger; 52 private Logger logger; 53 54 public void enableLogging(Logger logger) { 55 this.logger = logger; 56 this.requestErrorLogger = logger.getChildLogger("request-errors"); 57 } 58 59 private Logger getLogger() { 60 return logger; 61 } 62 63 66 public void service(ServiceManager serviceManager) throws ServiceException { 67 httpConnector = (HttpConnector)serviceManager.lookup("httpconnector"); 68 } 69 70 public void initialize() throws Exception { 71 httpConnector.addHandler(httpHandler); 72 } 73 74 public void dispose() { 75 httpConnector.removeHandler(httpHandler); 76 } 77 78 private class NavigationHttpHandler extends AbstractHttpHandler { 79 public void handle(String pathInContext, String pathParams, HttpRequest request, HttpResponse response) 80 throws HttpException, IOException { 81 String path = request.getPath(); 82 try { 83 Repository repository = ((DaisyUserPrincipal)request.getUserPrincipal()).getRepository(); 84 85 if (path.equals("/navigationLookup")) { 86 if (request.getMethod().equals("POST")) { 87 XmlOptions xmlOptions = new XmlOptions().setLoadUseXMLReader(LocalSAXParserFactory.newXmlReader()); 88 NavigationLookupDocument navigationLookupDocument = NavigationLookupDocument.Factory.parse(request.getInputStream(), xmlOptions); 89 if (!navigationLookupDocument.validate()) { 90 throw new BadRequestException("Invalid XML posted to navigationLookup."); 91 } 92 NavigationLookupDocument.NavigationLookup navigationLookupXml = navigationLookupDocument.getNavigationLookup(); 93 NavigationLookupDocument.NavigationLookup.LookupAlternative[] lookupAlternativesXml = navigationLookupXml.getLookupAlternativeArray(); 94 LookupAlternative[] lookupAlternatives = new LookupAlternative[lookupAlternativesXml.length]; 95 for (int i = 0; i < lookupAlternativesXml.length; i++) { 96 NavigationLookupDocument.NavigationLookup.LookupAlternative lookupAlternativeXml = lookupAlternativesXml[i]; 97 lookupAlternatives[i] = new LookupAlternative(lookupAlternativeXml.getName(), lookupAlternativeXml.getCollectionId(), 98 new VariantKey(lookupAlternativeXml.getNavDocId(), lookupAlternativeXml.getNavBranchId(), lookupAlternativeXml.getNavLangId()), 99 NavigationVersionMode.fromString(lookupAlternativeXml.getNavVersionMode())); 100 } 101 102 String navigationPath = navigationLookupXml.getNavigationPath(); 103 long requestedBranchId = navigationLookupXml.isSetRequestedBranchId() ? navigationLookupXml.getRequestedBranchId() : -1; 104 long requestedLangId = navigationLookupXml.isSetRequestedLanguageId() ? navigationLookupXml.getRequestedLanguageId() : -1; 105 106 NavigationManager navigationManager = (NavigationManager)repository.getExtension("NavigationManager"); 107 NavigationLookupResult lookupResult = navigationManager.lookup(navigationPath, requestedBranchId, requestedLangId, lookupAlternatives); 108 lookupResult.getXml().save(response.getOutputStream()); 109 response.commit(); 110 } else if (request.getMethod().equals("GET")) { 111 throw new BadRequestException("Using GET on /navigationLookup is no longer supported."); 112 } else { 113 response.sendError(HttpResponse.__405_Method_Not_Allowed); 114 response.commit(); 115 } 116 } else if (path.equals("/navigation")) { 117 long navigationDocId = HttpUtil.getLongParam(request, "navigationDocId"); 118 long navigationDocBranchId = HttpUtil.getBranchId(request, repository, "navigationDocBranch"); 119 long navigationDocLanguageId = HttpUtil.getLanguageId(request, repository, "navigationDocLanguage"); 120 VariantKey navigationDoc = new VariantKey(navigationDocId, navigationDocBranchId, navigationDocLanguageId); 121 122 String activePath = request.getParameter("activePath"); 124 VariantKey activeDocument = null; 125 if (request.getParameter("activeDocumentId") != null) { 126 long activeDocumentId = HttpUtil.getLongParam(request, "activeDocumentId"); 127 long activeDocumentBranchId = HttpUtil.getBranchId(request, repository, "activeDocumentBranch"); 128 long activeDocumentLanguageId = HttpUtil.getLanguageId(request, repository, "activeDocumentLanguage"); 129 activeDocument = new VariantKey(activeDocumentId, activeDocumentBranchId, activeDocumentLanguageId); 130 } 131 132 boolean contextualized = HttpUtil.getBooleanParam(request, "contextualized"); 133 boolean handleErrors = HttpUtil.getBooleanParam(request, "handleErrors"); 134 NavigationVersionMode versionMode = NavigationVersionMode.fromString(HttpUtil.getStringParam(request, "navigationVersionMode", "live")); 135 136 NavigationParams navigationParams = new NavigationParams(navigationDoc, versionMode, activePath, contextualized); 137 138 ByteArrayOutputStream bos = new ByteArrayOutputStream (5000); 139 ContentHandler serializer = new XmlSerializer(bos); 140 NavigationManager navigationManager = (NavigationManager)repository.getExtension("NavigationManager"); 141 navigationManager.generateNavigationTree(serializer, navigationParams, activeDocument, handleErrors); 142 143 bos.writeTo(response.getOutputStream()); 144 response.commit(); 145 } else if (path.equals("/navigationPreview")) { 146 String navigationXml = HttpUtil.getStringParam(request, "navigationXml"); 147 long branchId = HttpUtil.getBranchId(request, repository); 148 long languageId = HttpUtil.getLanguageId(request, repository); 149 150 ByteArrayOutputStream bos = new ByteArrayOutputStream (5000); 151 ContentHandler serializer = new XmlSerializer(bos); 152 NavigationManager navigationManager = (NavigationManager)repository.getExtension("NavigationManager"); 153 navigationManager.generatePreviewNavigationTree(serializer, navigationXml, branchId, languageId); 154 155 bos.writeTo(response.getOutputStream()); 156 response.commit(); 157 } 158 } catch (BadRequestException e) { 159 HttpUtil.sendCustomError(e.getMessage(), HttpResponse.__400_Bad_Request, response); 161 } catch (Throwable e) { 162 requestErrorLogger.error("Error processing request " + path, e); 163 HttpUtil.sendCustomError(e, HttpResponse.__202_Accepted, response); 164 } 165 } 166 } 167 } 168 | Popular Tags |