| /* |
| * 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.felix.http.base.internal.handler; |
| |
| import java.io.IOException; |
| |
| import javax.servlet.FilterChain; |
| import javax.servlet.ServletContext; |
| import javax.servlet.ServletException; |
| import javax.servlet.ServletRequest; |
| import javax.servlet.ServletResponse; |
| |
| import org.apache.felix.http.base.internal.logger.SystemLogger; |
| import org.apache.felix.http.base.internal.runtime.PreprocessorInfo; |
| import org.jetbrains.annotations.NotNull; |
| import org.osgi.framework.BundleContext; |
| import org.osgi.framework.ServiceReference; |
| import org.osgi.service.http.runtime.dto.DTOConstants; |
| import org.osgi.service.http.whiteboard.Preprocessor; |
| |
| /** |
| * The preprocessor handler handles the initialization and destruction of preprocessor |
| * objects. |
| */ |
| public class PreprocessorHandler implements Comparable<PreprocessorHandler> |
| { |
| private final PreprocessorInfo info; |
| |
| private final ServletContext context; |
| |
| private final BundleContext bundleContext; |
| |
| private volatile Preprocessor preprocessor; |
| |
| public PreprocessorHandler(final BundleContext bundleContext, |
| final ServletContext context, |
| final PreprocessorInfo info) |
| { |
| this.bundleContext = bundleContext; |
| this.context = context; |
| this.info = info; |
| } |
| |
| @Override |
| public int compareTo(final PreprocessorHandler other) |
| { |
| return this.info.compareTo(other.info); |
| } |
| |
| public ServletContext getContext() |
| { |
| return this.context; |
| } |
| |
| public PreprocessorInfo getPreprocessorInfo() |
| { |
| return this.info; |
| } |
| |
| public int init() |
| { |
| final ServiceReference<Preprocessor> serviceReference = this.info.getServiceReference(); |
| this.preprocessor = this.bundleContext.getService(serviceReference); |
| |
| if (this.preprocessor == null) |
| { |
| return DTOConstants.FAILURE_REASON_SERVICE_NOT_GETTABLE; |
| } |
| |
| try |
| { |
| this.preprocessor.init(new FilterConfigImpl(this.preprocessor.getClass().getName(), |
| getContext(), |
| getPreprocessorInfo().getInitParameters())); |
| } |
| catch (final Exception e) |
| { |
| SystemLogger.error(this.getPreprocessorInfo().getServiceReference(), |
| "Error during calling init() on preprocessor " + this.preprocessor, |
| e); |
| |
| this.preprocessor = null; |
| this.bundleContext.ungetService(serviceReference); |
| |
| return DTOConstants.FAILURE_REASON_EXCEPTION_ON_INIT; |
| } |
| |
| return -1; |
| } |
| |
| public boolean destroy() |
| { |
| if (this.preprocessor == null) |
| { |
| return false; |
| } |
| |
| try |
| { |
| preprocessor.destroy(); |
| } |
| catch ( final Exception ignore ) |
| { |
| // we ignore this |
| SystemLogger.error(this.getPreprocessorInfo().getServiceReference(), |
| "Error during calling destroy() on preprocessor " + this.preprocessor, |
| ignore); |
| } |
| this.preprocessor = null; |
| this.bundleContext.ungetService(this.info.getServiceReference()); |
| |
| return true; |
| } |
| |
| public void handle(@NotNull final ServletRequest req, |
| @NotNull final ServletResponse res, |
| @NotNull final FilterChain chain) throws ServletException, IOException |
| { |
| final Preprocessor local = this.preprocessor; |
| if ( local != null ) |
| { |
| local.doFilter(req, res, chain); |
| } |
| else |
| { |
| throw new ServletException("Preprocessor has been unregistered"); |
| } |
| } |
| |
| public boolean dispose() |
| { |
| // fully destroy the preprocessor |
| return this.destroy(); |
| } |
| |
| @Override |
| public int hashCode() |
| { |
| return 31 + info.hashCode(); |
| } |
| |
| @Override |
| public boolean equals(final Object obj) |
| { |
| if (this == obj) |
| { |
| return true; |
| } |
| if (obj == null || getClass() != obj.getClass() ) |
| { |
| return false; |
| } |
| final PreprocessorHandler other = (PreprocessorHandler) obj; |
| return info.equals(other.info); |
| } |
| } |