/******************************************************************************* * Copyright (c) 2014 Raymond Augé and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Raymond Augé <raymond.auge@liferay.com> - Bug 436698 ******************************************************************************/ package org.eclipse.equinox.http.servlet.internal.customizer; import java.util.concurrent.atomic.AtomicReference; import javax.servlet.Servlet; import org.eclipse.equinox.http.servlet.dto.ExtendedFailedServletDTO; import org.eclipse.equinox.http.servlet.internal.HttpServiceRuntimeImpl; import org.eclipse.equinox.http.servlet.internal.context.ContextController; import org.eclipse.equinox.http.servlet.internal.error.HttpWhiteboardFailureException; import org.eclipse.equinox.http.servlet.internal.registration.ServletRegistration; import org.eclipse.equinox.http.servlet.internal.util.*; import org.osgi.framework.*; import org.osgi.service.http.runtime.dto.DTOConstants; import org.osgi.service.http.whiteboard.HttpWhiteboardConstants; /** * @author Raymond Augé */ public class ContextServletTrackerCustomizer extends RegistrationServiceTrackerCustomizer<Servlet, AtomicReference<ServletRegistration>> { public ContextServletTrackerCustomizer( BundleContext bundleContext, HttpServiceRuntimeImpl httpServiceRuntime, ContextController contextController) { super(bundleContext, httpServiceRuntime); this.contextController = contextController; } @Override public AtomicReference<ServletRegistration> addingService( ServiceReference<Servlet> serviceReference) { AtomicReference<ServletRegistration> result = new AtomicReference<ServletRegistration>(); if (!httpServiceRuntime.matches(serviceReference)) { return result; } if (!contextController.matches(serviceReference)) { return result; } try { result.set(contextController.addServletRegistration(serviceReference)); } catch (HttpWhiteboardFailureException hwfe) { httpServiceRuntime.log(hwfe.getMessage(), hwfe); recordFailedServletDTO(serviceReference, hwfe.getFailureReason()); } catch (Throwable t) { httpServiceRuntime.log(t.getMessage(), t); recordFailedServletDTO(serviceReference, DTOConstants.FAILURE_REASON_EXCEPTION_ON_INIT); } return result; } @Override public void modifiedService( ServiceReference<Servlet> serviceReference, AtomicReference<ServletRegistration> servletReference) { removedService(serviceReference, servletReference); AtomicReference<ServletRegistration> added = addingService(serviceReference); servletReference.set(added.get()); } @Override public void removedService( ServiceReference<Servlet> serviceReference, AtomicReference<ServletRegistration> servletReference) { ServletRegistration registration = servletReference.get(); if (registration != null) { // destroy will unget the service object we were using registration.destroy(); } contextController.getHttpServiceRuntime().removeFailedServletDTOs(serviceReference); } private void recordFailedServletDTO( ServiceReference<Servlet> serviceReference, int failureReason) { ExtendedFailedServletDTO failedServletDTO = new ExtendedFailedServletDTO(); failedServletDTO.asyncSupported = BooleanPlus.from( serviceReference.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED), false); failedServletDTO.failureReason = failureReason; failedServletDTO.initParams = ServiceProperties.parseInitParams( serviceReference, HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX); failedServletDTO.multipartEnabled = ServiceProperties.parseBoolean( serviceReference, Const.EQUINOX_HTTP_MULTIPART_ENABLED); Integer multipartFileSizeThreshold = (Integer)serviceReference.getProperty( Const.EQUINOX_HTTP_MULTIPART_FILESIZETHRESHOLD); if (multipartFileSizeThreshold != null) { failedServletDTO.multipartFileSizeThreshold = multipartFileSizeThreshold; } failedServletDTO.multipartLocation = (String)serviceReference.getProperty( Const.EQUINOX_HTTP_MULTIPART_LOCATION); Long multipartMaxFileSize = (Long)serviceReference.getProperty( Const.EQUINOX_HTTP_MULTIPART_MAXFILESIZE); if (multipartMaxFileSize != null) { failedServletDTO.multipartMaxFileSize = multipartMaxFileSize; } Long multipartMaxRequestSize = (Long)serviceReference.getProperty( Const.EQUINOX_HTTP_MULTIPART_MAXREQUESTSIZE); if (multipartMaxRequestSize != null) { failedServletDTO.multipartMaxRequestSize = multipartMaxRequestSize; } failedServletDTO.name = (String)serviceReference.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME); failedServletDTO.patterns = StringPlus.from( serviceReference.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN)).toArray(new String[0]); failedServletDTO.serviceId = (Long)serviceReference.getProperty(Constants.SERVICE_ID); failedServletDTO.servletContextId = contextController.getServiceId(); failedServletDTO.servletInfo = Const.BLANK; contextController.getHttpServiceRuntime().recordFailedServletDTO(serviceReference, failedServletDTO); } private ContextController contextController; }