/** * (C) Copyright 2013 Jabylon (http://www.jabylon.org) 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 */ package org.jabylon.rest.api; import java.util.Dictionary; import javax.servlet.ServletException; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.ConfigurationPolicy; import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Modified; import org.apache.felix.scr.annotations.Reference; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.view.CDOView; import org.jabylon.cdo.connector.RepositoryConnector; import org.jabylon.cdo.server.ServerConstants; import org.jabylon.properties.Workspace; import org.jabylon.resources.persistence.PropertyPersistenceService; import org.jabylon.security.auth.AuthenticationService; import org.osgi.service.component.ComponentContext; import org.osgi.service.http.HttpService; import org.osgi.service.http.NamespaceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Component(policy = ConfigurationPolicy.OPTIONAL) public class APIComponent { private static final String PROPERTY_SERVLET_ALIAS = "servlet.context"; @Reference private HttpService httpService; @Reference private RepositoryConnector repositoryConnector; @Reference private PropertyPersistenceService persistenceService; @Reference private AuthenticationService authService; private CDOView view; private String webContext; private static final Logger logger = LoggerFactory.getLogger(APIComponent.class); public void bindHttpService(HttpService httpService) { this.httpService = httpService; } public void unbindHttpService(HttpService httpService) { logger.info("Http Service deactivated. Shutting down Jabylon REST API"); this.httpService = null; } @Activate protected void startup(final ComponentContext context) { try { webContext = getWebContext(context.getProperties()); view = getRepositoryConnector().openView(); CDOResource resource = view.getResource(ServerConstants.WORKSPACE_RESOURCE); logger.info("Starting up Jabylon REST API servlet at " + webContext); ApiServlet servlet = new ApiServlet((Workspace)resource.getContents().get(0), authService, persistenceService); httpService.registerServlet(webContext, servlet, null, null); } catch (ServletException e) { logger.error("Failed to register Jabylon REST API servlet", e); } catch (NamespaceException e) { logger.error("Failed to register Jabylon REST API servlet", e); } } @Deactivate protected void shutdown(final ComponentContext context) { httpService.unregister(getWebContext(context.getProperties())); logger.info("Shutting down Jabylon REST API"); view.close(); } @Modified protected void modify(final ComponentContext context) { String oldContext = webContext; webContext = getWebContext(context.getProperties()); logger.info("Switching Jabylon REST API from {} to new context {}", oldContext, webContext); try { CDOResource resource = view.getResource(ServerConstants.WORKSPACE_RESOURCE); ApiServlet servlet = new ApiServlet((Workspace)resource.getContents().get(0), authService, persistenceService); httpService.registerServlet(webContext, servlet, null, null); httpService.unregister(getWebContext(context.getProperties())); } catch (ServletException e) { logger.error("Failed to register Jabylon REST API servlet", e); } catch (NamespaceException e) { logger.error("Failed to register Jabylon REST API servlet", e); } } public void bindRepositoryConnector(RepositoryConnector repositoryConnector) { this.repositoryConnector = repositoryConnector; } public void unbindRepositoryConnector(RepositoryConnector repositoryConnector) { this.repositoryConnector = null; } public RepositoryConnector getRepositoryConnector() { return repositoryConnector; } public PropertyPersistenceService getPersistenceService() { return persistenceService; } public void bindPersistenceService(PropertyPersistenceService persistenceService) { this.persistenceService = persistenceService; } public void unbindPersistenceService(PropertyPersistenceService persistenceService) { this.persistenceService = null; } public void bindAuthService(AuthenticationService service) { this.authService = service; } public void unbindAuthService(AuthenticationService service) { this.authService = null; } private String getWebContext(Dictionary< ? , ? > properties) { Object result = properties.get(PROPERTY_SERVLET_ALIAS); if (result instanceof String) { String context = (String)result; return context; } return "/api"; } }