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}