001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.geronimo.jetty.cluster;
019
020 import java.io.IOException;
021
022 import org.apache.geronimo.clustering.ClusteredInvocation;
023 import org.apache.geronimo.clustering.ClusteredInvocationException;
024 import org.apache.geronimo.jetty.GeronimoServletHttpRequest;
025 import org.apache.geronimo.jetty.HandleInterceptor;
026 import org.mortbay.http.HttpException;
027 import org.mortbay.http.HttpRequest;
028 import org.mortbay.http.HttpResponse;
029
030 /**
031 *
032 * @version $Rev$ $Date$
033 */
034 public abstract class AbstractClusteredHandleInterceptor implements HandleInterceptor {
035
036 public void handle(String pathInContext, String pathParams, HttpRequest httpRequest, HttpResponse httpResponse,
037 HandleInterceptor end) throws HttpException, IOException {
038 ClusteredInvocation invocation =
039 newClusteredInvocation(pathInContext, pathParams, httpRequest, httpResponse, end);
040 try {
041 invocation.invoke();
042 } catch (ClusteredInvocationException e) {
043 Throwable cause = e.getCause();
044 if (cause instanceof HttpException) {
045 throw (HttpException) cause;
046 } else if (cause instanceof IOException) {
047 throw (IOException) cause;
048 } else {
049 throw (IOException) new IOException().initCause(cause);
050 }
051 }
052 }
053
054 protected abstract ClusteredInvocation newClusteredInvocation(String pathInContext, String pathParams,
055 HttpRequest request, HttpResponse response, HandleInterceptor end);
056
057 protected abstract class WebClusteredInvocation implements ClusteredInvocation {
058 protected final String pathInContext;
059 protected final String pathParams;
060 protected final HttpRequest request;
061 protected final HttpResponse response;
062 protected final HandleInterceptor end;
063
064 public WebClusteredInvocation(String pathInContext, String pathParams, HttpRequest request,
065 HttpResponse response, HandleInterceptor end) {
066 this.pathInContext = pathInContext;
067 this.pathParams = pathParams;
068 this.request = request;
069 this.response = response;
070 this.end = end;
071
072 GeronimoServletHttpRequest servletHttpRequest = (GeronimoServletHttpRequest) request.getWrapper();
073 servletHttpRequest.setRequestedSessionId(pathParams);
074 }
075
076 protected void invokeLocally() throws ClusteredInvocationException {
077 try {
078 end.handle(pathInContext, pathParams, request, response, null);
079 } catch (IOException e) {
080 throw new ClusteredInvocationException(e);
081 }
082 }
083
084 public String getRequestedSessionId() {
085 GeronimoServletHttpRequest servletHttpRequest = (GeronimoServletHttpRequest) request.getWrapper();
086 return servletHttpRequest.getRequestedSessionId();
087 }
088 }
089 }