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 java.util.ArrayList;
015
016import javax.servlet.ServletConfig;
017import javax.servlet.ServletContextEvent;
018import javax.servlet.ServletContextListener;
019
020import org.nuxeo.common.xmap.annotation.XNodeList;
021import org.nuxeo.common.xmap.annotation.XObject;
022import org.nuxeo.ecm.webengine.jaxrs.BundleNotFoundException;
023
024/**
025 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
026 */
027@XObject("listeners")
028public class ListenerSetDescriptor {
029
030    @XNodeList(value = "listener", type = ArrayList.class, componentType = ListenerDescriptor.class, trim = true, nullByDefault = false)
031    protected ArrayList<ListenerDescriptor> listenerDescriptors;
032
033    private ServletContextListener[] listeners;
034
035    private ServletContextEvent event;
036
037    public synchronized boolean isInitialized() {
038        return event != null;
039    }
040
041    public synchronized void init(ServletConfig config) throws ReflectiveOperationException, BundleNotFoundException {
042        if (event == null && !listenerDescriptors.isEmpty()) {
043            event = new ServletContextEvent(config.getServletContext());
044            listeners = new ServletContextListener[listenerDescriptors.size()];
045            for (int i = 0; i < listeners.length; i++) {
046                ListenerDescriptor ld = listenerDescriptors.get(i);
047                listeners[i] = ld.getListener();
048                listeners[i].contextInitialized(event);
049            }
050        }
051    }
052
053    public synchronized boolean destroy() {
054        if (event != null) {
055            if (listeners != null) {
056                try {
057                    for (ServletContextListener listener : listeners) {
058                        listener.contextDestroyed(event);
059                    }
060                } finally {
061                    event = null;
062                    listeners = null;
063                }
064                return true;
065            }
066        }
067        return false;
068    }
069
070    @Override
071    public String toString() {
072        return listenerDescriptors.toString();
073    }
074
075}