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 *     Nuxeo - initial API and implementation
011 *
012 * $Id$
013 */
014
015package org.nuxeo.ecm.core.api.adapter;
016
017import java.util.Collection;
018import java.util.Map;
019import java.util.concurrent.ConcurrentHashMap;
020
021import org.apache.commons.logging.Log;
022import org.apache.commons.logging.LogFactory;
023import org.nuxeo.runtime.model.ComponentContext;
024import org.nuxeo.runtime.model.ComponentInstance;
025import org.nuxeo.runtime.model.ComponentName;
026import org.nuxeo.runtime.model.DefaultComponent;
027
028/**
029 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
030 */
031public class DocumentAdapterService extends DefaultComponent {
032
033    public static final ComponentName NAME = new ComponentName(ComponentName.DEFAULT_TYPE,
034            "org.nuxeo.ecm.core.api.DocumentAdapterService");
035
036    private static final Log log = LogFactory.getLog(DocumentAdapterService.class);
037
038    /**
039     * Document adapters
040     */
041    protected Map<Class<?>, DocumentAdapterDescriptor> adapters;
042
043    public DocumentAdapterDescriptor getAdapterDescriptor(Class<?> itf) {
044        return adapters.get(itf);
045    }
046
047    /**
048     * @since 5.7
049     */
050    public DocumentAdapterDescriptor[] getAdapterDescriptors() {
051        Collection<DocumentAdapterDescriptor> values = adapters.values();
052        return values.toArray(new DocumentAdapterDescriptor[values.size()]);
053    }
054
055    public void registerAdapterFactory(DocumentAdapterDescriptor dae) {
056        adapters.put(dae.getInterface(), dae);
057        log.info("Registered document adapter factory " + dae);
058    }
059
060    public void unregisterAdapterFactory(Class<?> itf) {
061        DocumentAdapterDescriptor dae = adapters.remove(itf);
062        if (dae != null) {
063            log.info("Unregistered document adapter factory: " + dae);
064        }
065    }
066
067    @Override
068    public void activate(ComponentContext context) {
069        adapters = new ConcurrentHashMap<Class<?>, DocumentAdapterDescriptor>();
070    }
071
072    @Override
073    public void deactivate(ComponentContext context) {
074        adapters.clear();
075        adapters = null;
076    }
077
078    @Override
079    public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
080        if (extensionPoint.equals("adapters")) {
081            DocumentAdapterDescriptor dae = (DocumentAdapterDescriptor) contribution;
082            registerAdapterFactory(dae);
083        }
084    }
085
086    @Override
087    public void unregisterContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
088        if (extensionPoint.equals("adapters")) {
089            DocumentAdapterDescriptor dae = (DocumentAdapterDescriptor) contribution;
090            unregisterAdapterFactory(dae.getInterface());
091        }
092    }
093
094}