KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > navigation > impl > NavigationHttpConnector


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

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 JavaDoc;
38 import java.io.ByteArrayOutputStream JavaDoc;
39 import org.xml.sax.ContentHandler JavaDoc;
40 import org.outerx.daisy.x10Navigationspec.NavigationLookupDocument;
41
42 /**
43  * Exposes the functionality of the NavigationManager via HTTP. This is done by registering
44  * an extra HttpHandler on the HttpConnector of the repository server.
45  *
46  * @avalon.component version="1.0" name="navigation-httpconnector" lifestyle="singleton"
47  */

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     /**
64      * @avalon.dependency key="httpconnector" type="org.outerj.daisy.httpconnector.HttpConnector"
65      */

66     public void service(ServiceManager serviceManager) throws ServiceException {
67         httpConnector = (HttpConnector)serviceManager.lookup("httpconnector");
68     }
69
70     public void initialize() throws Exception JavaDoc {
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 JavaDoc pathInContext, String JavaDoc pathParams, HttpRequest request, HttpResponse response)
80                 throws HttpException, IOException JavaDoc {
81             String JavaDoc 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 JavaDoc 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 JavaDoc activePath = request.getParameter("activePath"); // this is allowed to be null
123

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 JavaDoc bos = new ByteArrayOutputStream JavaDoc(5000);
139                     ContentHandler JavaDoc 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 JavaDoc navigationXml = HttpUtil.getStringParam(request, "navigationXml");
147                     long branchId = HttpUtil.getBranchId(request, repository);
148                     long languageId = HttpUtil.getLanguageId(request, repository);
149
150                     ByteArrayOutputStream JavaDoc bos = new ByteArrayOutputStream JavaDoc(5000);
151                     ContentHandler JavaDoc 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                 // doesn't need to be logged
160
HttpUtil.sendCustomError(e.getMessage(), HttpResponse.__400_Bad_Request, response);
161             } catch (Throwable JavaDoc e) {
162                 requestErrorLogger.error("Error processing request " + path, e);
163                 HttpUtil.sendCustomError(e, HttpResponse.__202_Accepted, response);
164             }
165         }
166     }
167 }
168
Popular Tags