001/*
002 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *     bstefanescu
011 */
012package org.nuxeo.ecm.webengine.jaxrs.servlet.config;
013
014import javax.servlet.ServletException;
015
016import org.nuxeo.runtime.model.ComponentContext;
017import org.nuxeo.runtime.model.ComponentInstance;
018import org.nuxeo.runtime.model.DefaultComponent;
019import org.nuxeo.ecm.webengine.jaxrs.ApplicationManager;
020import org.osgi.service.http.NamespaceException;
021
022/**
023 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
024 */
025public class ServletRegistryComponent extends DefaultComponent {
026
027    public static final String XP_SERVLETS = "servlets";
028
029    public static final String XP_FILTERS = "filters";
030
031    public static final String XP_RESOURCES = "resources";
032
033    public static final String XP_SUBRESOURCES = "subresources";
034
035    protected ServletRegistry registry;
036
037    public ServletRegistryComponent() {
038    }
039
040    @Override
041    public void activate(ComponentContext context) {
042        registry = ServletRegistry.getInstance();
043    }
044
045    @Override
046    public void deactivate(ComponentContext context) {
047        ServletRegistry.dispose();
048        registry = null;
049    }
050
051    @Override
052    public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
053        if (XP_SERVLETS.equals(extensionPoint)) {
054            ((ServletDescriptor) contribution).setBundle(contributor.getContext().getBundle());
055            try {
056                registry.addServlet((ServletDescriptor) contribution);
057            } catch (ServletException | NamespaceException e) {
058                throw new RuntimeException(e);
059            }
060        } else if (XP_FILTERS.equals(extensionPoint)) {
061            registry.addFilterSet((FilterSetDescriptor) contribution);
062        } else if (XP_RESOURCES.equals(extensionPoint)) {
063            ResourcesDescriptor rd = (ResourcesDescriptor) contribution;
064            rd.setBundle(contributor.getContext().getBundle());
065            registry.addResources(rd);
066        } else if (XP_SUBRESOURCES.equals(extensionPoint)) {
067            ResourceExtension rxt = (ResourceExtension) contribution;
068            rxt.setBundle(contributor.getContext().getBundle());
069            ApplicationManager.getInstance().getOrCreateApplication(rxt.getApplication()).addExtension(rxt);
070        }
071    }
072
073    @Override
074    public void unregisterContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
075        if (XP_SERVLETS.equals(extensionPoint)) {
076            registry.removeServlet((ServletDescriptor) contribution);
077        } else if (XP_FILTERS.equals(extensionPoint)) {
078            registry.removeFilterSet((FilterSetDescriptor) contribution);
079        } else if (XP_RESOURCES.equals(extensionPoint)) {
080            ResourcesDescriptor rd = (ResourcesDescriptor) contribution;
081            rd.setBundle(contributor.getContext().getBundle());
082            registry.removeResources(rd);
083        } else if (XP_SUBRESOURCES.equals(extensionPoint)) {
084            ResourceExtension rxt = (ResourceExtension) contribution;
085            rxt.setBundle(contributor.getContext().getBundle());
086            ApplicationManager.getInstance().getOrCreateApplication(rxt.getApplication()).removeExtension(rxt);
087        }
088    }
089
090}