/** * 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.io.rest.internal.resources; import java.io.IOException; import java.util.ArrayList; import java.util.Dictionary; import java.util.List; import java.util.Properties; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.eclipse.smarthome.io.rest.RESTConstants; import org.eclipse.smarthome.io.rest.RESTResource; import org.eclipse.smarthome.io.rest.SatisfiableRESTResource; import org.eclipse.smarthome.io.rest.internal.Constants; import org.eclipse.smarthome.io.rest.internal.resources.beans.RootBean; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * <p> * This class acts as an entry point / root resource for the REST API. * </p> * <p> * In good HATEOAS manner, it provides links to other offered resources. * </p> * * <p> * The result is returned as JSON * </p> * * @author Kai Kreuzer - Initial contribution and API */ @Path("/") public class RootResource { private final transient Logger logger = LoggerFactory.getLogger(RootResource.class); private List<RESTResource> restResources = new ArrayList<RESTResource>(); private ConfigurationAdmin configurationAdmin; @Context UriInfo uriInfo; @GET @Produces(MediaType.APPLICATION_JSON) public Response getRoot(@Context HttpHeaders headers) { return Response.ok(getRootBean()).build(); } private RootBean getRootBean() { RootBean bean = new RootBean(); for (RESTResource resource : restResources) { // we will include all RESTResources and only the SatisfiableRESTResources that are currently satisfied if (!(resource instanceof SatisfiableRESTResource) || ((SatisfiableRESTResource) resource).isSatisfied()) { String path = resource.getClass().getAnnotation(Path.class).value(); bean.links .add(new RootBean.Links(path, uriInfo.getBaseUriBuilder().path(path).build().toASCIIString())); } } return bean; } public void addRESTResource(RESTResource resource) { restResources.add(resource); } public void removeRESTResource(RESTResource resource) { restResources.remove(resource); } @SuppressWarnings({ "rawtypes", "unchecked" }) public void activate() { Configuration configuration; try { configuration = configurationAdmin.getConfiguration(Constants.JAXRS_CONNECTOR_CONFIG, null); if (configuration != null) { Dictionary properties = configuration.getProperties(); if (properties == null) { properties = new Properties(); } String rootAlias = (String) properties.get(Constants.JAXRS_CONNECTOR_ROOT_PROPERTY); if (!RESTConstants.REST_URI.equals(rootAlias)) { properties.put(Constants.JAXRS_CONNECTOR_ROOT_PROPERTY, RESTConstants.REST_URI); configuration.update(properties); } } } catch (IOException e) { logger.error("Could not set REST configuration properties!", e); } } protected void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) { this.configurationAdmin = configurationAdmin; } protected void unsetConfigurationAdmin(ConfigurationAdmin configurationAdmin) { this.configurationAdmin = null; } }