/** * Copyright (c) 2014-2017 by the respective copyright holders. * 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 */ package org.eclipse.smarthome.core.net; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Some utility functions related to the http service * * @author Markus Rathgeb - Initial contribution and API */ public class HttpServiceUtil { private HttpServiceUtil() { } /** * Get the port that is used by the HTTP service. * * @param bc the bundle context used for lookup * @return the port if used, -1 if no port could be found */ public static int getHttpServicePort(final BundleContext bc) { return getHttpServicePortProperty(bc, "org.osgi.service.http.port"); } public static int getHttpServicePortSecure(final BundleContext bc) { return getHttpServicePortProperty(bc, "org.osgi.service.http.port.secure"); } // Utility method that could be used for non-secure and secure port. @SuppressWarnings("rawtypes") private static int getHttpServicePortProperty(final BundleContext bc, final String propertyName) { Object value; int port = -1; // Try to find the port by using the service property (respect service ranking). try { int candidate = Integer.MIN_VALUE; final ServiceReference[] refs = bc.getAllServiceReferences("org.osgi.service.http.HttpService", null); if (refs != null) { for (final ServiceReference ref : refs) { value = ref.getProperty(propertyName); if (value == null) { continue; } final int servicePort; try { servicePort = Integer.parseInt(value.toString()); } catch (final NumberFormatException ex) { continue; } value = ref.getProperty(Constants.SERVICE_RANKING); final int serviceRanking; if (value == null || !(value instanceof Integer)) { serviceRanking = 0; } else { serviceRanking = (Integer) value; } if (serviceRanking >= candidate) { candidate = serviceRanking; port = servicePort; } } } } catch (final InvalidSyntaxException ex) { // This point of code should never be reached. final Logger logger = LoggerFactory.getLogger(HttpServiceUtil.class); logger.warn("This error should only be thrown if a filter could not be parsed. We don't use a filter..."); } if (port > 0) { return port; } // If the service does not provide the port, try to use the system property. value = bc.getProperty(propertyName); if (value != null) { if (value instanceof String) { try { return Integer.parseInt(value.toString()); } catch (final NumberFormatException ex) { // If the property could not be parsed, the HTTP servlet itself has to care and warn about. } } else if (value instanceof Integer) { return (Integer) value; } } return -1; } }