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 *     Florent Guillaume
011 */
012package org.nuxeo.ecm.core.storage.sql.jdbc;
013
014import java.util.ArrayList;
015import java.util.Collections;
016import java.util.HashSet;
017import java.util.List;
018import java.util.Set;
019
020import org.apache.commons.logging.Log;
021import org.apache.commons.logging.LogFactory;
022import org.nuxeo.ecm.core.query.sql.NXQL;
023import org.nuxeo.runtime.model.ComponentInstance;
024import org.nuxeo.runtime.model.DefaultComponent;
025
026/**
027 * Service for the registration of QueryMaker classes.
028 */
029public class QueryMakerServiceImpl extends DefaultComponent implements QueryMakerService {
030
031    private static final Log log = LogFactory.getLog(QueryMakerServiceImpl.class);
032
033    public static final String XP = "queryMaker";
034
035    protected final List<QueryMakerDescriptor> descriptors = new ArrayList<QueryMakerDescriptor>(2);
036
037    protected List<Class<? extends QueryMaker>> queryMakers;
038
039    @Override
040    public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
041        if (XP.equals(extensionPoint)) {
042            registerQueryMaker((QueryMakerDescriptor) contribution);
043        }
044    }
045
046    @Override
047    public void unregisterContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
048        if (XP.equals(extensionPoint)) {
049            unregisterQueryMaker((QueryMakerDescriptor) contribution);
050        }
051    }
052
053    @Override
054    public void registerQueryMaker(QueryMakerDescriptor descriptor) {
055        if (descriptor.enabled) {
056            log.info(String.format("Registering QueryMaker '%s': %s", descriptor.name, descriptor.queryMaker.getName()));
057        } else {
058            log.info(String.format("Disabling QueryMaker '%s'", descriptor.name));
059        }
060        descriptors.add(descriptor);
061        queryMakers = null;
062    }
063
064    @Override
065    public void unregisterQueryMaker(QueryMakerDescriptor descriptor) {
066        if (descriptor.enabled) {
067            log.info(String.format("Unregistering QueryMaker '%s': %s", descriptor.name,
068                    descriptor.queryMaker.getName()));
069        } else {
070            log.info(String.format("Unregistering disabled QueryMaker '%s'", descriptor.name));
071        }
072        descriptors.remove(descriptor);
073        queryMakers = null;
074    }
075
076    @Override
077    public synchronized List<Class<? extends QueryMaker>> getQueryMakers() {
078        if (queryMakers == null) {
079            // recompute queryMakers
080            queryMakers = new ArrayList<Class<? extends QueryMaker>>(2);
081            List<QueryMakerDescriptor> qmdl = new ArrayList<QueryMakerDescriptor>(descriptors);
082            Collections.reverse(qmdl);
083            Set<String> done = new HashSet<String>();
084            for (QueryMakerDescriptor descriptor : qmdl) {
085                if (!done.add(descriptor.name)) {
086                    continue;
087                }
088                if (descriptor.enabled) {
089                    queryMakers.add(descriptor.queryMaker);
090                }
091            }
092            Collections.reverse(queryMakers);
093            // BBB backward compat
094            if (queryMakers.isEmpty() && !done.contains(NXQL.NXQL)) {
095                queryMakers.add(NXQLQueryMaker.class);
096            }
097        }
098        return queryMakers;
099    }
100}