001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018
019 package org.apache.geronimo.jetty6.handler;
020
021 import java.io.IOException;
022 import java.util.Set;
023
024 import javax.resource.ResourceException;
025 import javax.servlet.ServletException;
026 import javax.servlet.http.HttpServletRequest;
027 import javax.servlet.http.HttpServletResponse;
028
029 import org.apache.geronimo.connector.outbound.connectiontracking.ConnectorInstanceContext;
030 import org.apache.geronimo.connector.outbound.connectiontracking.ConnectorInstanceContextImpl;
031 import org.apache.geronimo.connector.outbound.connectiontracking.SharedConnectorInstanceContext;
032 import org.apache.geronimo.connector.outbound.connectiontracking.TrackedConnectionAssociator;
033 import org.mortbay.jetty.Handler;
034 import org.mortbay.jetty.handler.AbstractHandler;
035
036 /**
037 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
038 */
039 public class InstanceContextHandler extends AbstractImmutableHandler {
040
041 private final Set unshareableResources;
042 private final Set applicationManagedSecurityResources;
043 private final TrackedConnectionAssociator trackedConnectionAssociator;
044
045 public InstanceContextHandler(Handler next, Set unshareableResources, Set applicationManagedSecurityResources, TrackedConnectionAssociator trackedConnectionAssociator) {
046 super(next);
047 this.unshareableResources = unshareableResources;
048 this.applicationManagedSecurityResources = applicationManagedSecurityResources;
049 this.trackedConnectionAssociator = trackedConnectionAssociator;
050 }
051
052 public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException {
053 try {
054 if (dispatch == Handler.REQUEST) {
055 ConnectorInstanceContext oldContext = trackedConnectionAssociator.enter(new SharedConnectorInstanceContext(unshareableResources, applicationManagedSecurityResources, false));
056
057 try {
058 next.handle(target, request, response, dispatch);
059 } finally {
060 trackedConnectionAssociator.exit(oldContext);
061 }
062 } else {
063 SharedConnectorInstanceContext context = new SharedConnectorInstanceContext(unshareableResources, applicationManagedSecurityResources, true);
064 SharedConnectorInstanceContext oldContext = (SharedConnectorInstanceContext) trackedConnectionAssociator.enter(context);
065 context.share(oldContext);
066 try {
067 next.handle(target, request, response, dispatch);
068 } finally {
069 context.hide();
070 trackedConnectionAssociator.exit(oldContext);
071 }
072 }
073 } catch (ResourceException e) {
074 throw new ServletException(e);
075 }
076 }
077
078 public void lifecycleCommand(LifecycleCommand lifecycleCommand) throws Exception {
079 ConnectorInstanceContext oldContext = trackedConnectionAssociator.enter(new ConnectorInstanceContextImpl(unshareableResources, applicationManagedSecurityResources));
080 try {
081 super.lifecycleCommand(lifecycleCommand);
082 } finally {
083 trackedConnectionAssociator.exit(oldContext);
084 }
085 }
086 }