/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.openejb.server.httpd;
import org.apache.openejb.loader.SystemInstance;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FilterListener implements HttpListener {
private final String context;
private final Filter delegate;
public FilterListener(final Filter filter, final String contextRoot) {
delegate = filter;
context = contextRoot;
}
@Override
public void onMessage(final HttpRequest request, final HttpResponse response) throws Exception {
HttpRequestImpl req = null;
if (request instanceof HttpRequestImpl) {
req = (HttpRequestImpl) request;
} else if (request instanceof ServletRequestAdapter) {
final HttpServletRequest delegate = ((ServletRequestAdapter) request).getRequest();
if (delegate instanceof HttpRequestImpl) {
req = (HttpRequestImpl) delegate;
}
}
if (req != null) {
req.initPathFromContext((!context.startsWith("/") ? "/" : "") + context);
}
delegate.doFilter(request, response, new SimpleFilterChain(this));
}
public Filter getDelegate() {
return delegate;
}
private static class SimpleFilterChain implements FilterChain {
private final FilterListener origin;
private SimpleFilterChain(final FilterListener origin) {
this.origin = origin;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
final HttpListenerRegistry registry = SystemInstance.get().getComponent(HttpListenerRegistry.class);
registry.setOrigin(origin);
try {
registry.onMessage(
HttpRequest.class.isInstance(request) ? HttpRequest.class.cast(request) : new ServletRequestAdapter(HttpServletRequest.class.cast(request)),
HttpResponse.class.isInstance(response) ? HttpResponse.class.cast(response) : new ServletResponseAdapter(HttpServletResponse.class.cast(response)));
} catch (final RuntimeException re) {
throw re;
} catch (final ServletException e) {
final Throwable cause = e.getCause();
if (RuntimeException.class.isInstance(cause)) { // frameworks generally wrap with ServletException
throw RuntimeException.class.cast(cause);
}
throw e;
} catch (final IOException e) {
throw e;
} catch (final Exception e) {
throw new ServletException(e);
} finally {
registry.setOrigin(origin);
}
}
}
}