/** * Copyright (c) 2010 Kenn Hussey and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * Kenn Hussey - Initial API and implementation */ package org.eclipse.emf.ecore.util; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.ecore.EClassifier; /** * An interface for delegating query execution. * * @since 2.7 */ public interface QueryDelegate { /** * A factory for creating query delegates. */ interface Factory { /** * Creates a query delegate for the specified <tt>expression</tt>. * * @param context the type of object against which the query will be executed * @param parameters a map of parameter names to types * @param expression the query text * @return a query delegate */ QueryDelegate createQueryDelegate(EClassifier context, Map<String, EClassifier> parameters, String expression); /** * A <code>Factory</code> wrapper that is used by the {@link Factory.Registry}. */ interface Descriptor { Factory getFactory(); } /** * A registry of query delegate factories. */ interface Registry extends Map<String, Object> { Registry INSTANCE = new Impl(); Factory getFactory(String uri); class Impl extends HashMap<String, Object> implements Registry { private static final long serialVersionUID = 1L; @Override public Object get(Object key) { Object factory = super.get(key); if (factory instanceof Descriptor) { Descriptor factoryDescriptor = (Descriptor)factory; factory = factoryDescriptor.getFactory(); put((String)key, factory); return factory; } else { return factory; } } public Factory getFactory(String uri) { return (Factory)get(uri); } } } } /** * Prepares (e.g., parses) the query for execution. * * @throws InvocationTargetException in case of failure to prepare (e.g., parse) the * query, usually because of an exception */ void prepare() throws InvocationTargetException; /** * Executes the query against the specified <tt>target</tt> object. * * @param target the object against which to execute the query; must be an instance of the context * with which the delegate was created * @param arguments a map of parameter names to values; must correspond to the parameters * with which the delegate was created * @return the query's result * @throws InvocationTargetException in case of failure to execute the * query, usually because of an exception */ Object execute(Object target, Map<String, ?> arguments) throws InvocationTargetException; }