blob: cfe11a3f4ceb459444b5ecdde57743cf87fb0744 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.calcite.util;
import java.lang.reflect.Method;
import java.util.List;
/**
* Interface for looking up methods relating to reflective visitation. One
* possible implementation would cache the results.
*
* <p>Type parameter 'R' is the base class of visitoR class; type parameter 'E'
* is the base class of visiteE class.
*
* <p>TODO: obsolete {@link ReflectUtil#lookupVisitMethod}, and use caching in
* implementing that method.
*
* @param <E> Argument type
* @param <R> Return type
*/
public interface ReflectiveVisitDispatcher<R extends ReflectiveVisitor, E> {
//~ Methods ----------------------------------------------------------------
/**
* Looks up a visit method taking additional parameters beyond the
* overloaded visitee type.
*
* @param visitorClass class of object whose visit method is to be
* invoked
* @param visiteeClass class of object to be passed as a parameter
* to the visit method
* @param visitMethodName name of visit method
* @param additionalParameterTypes list of additional parameter types
* @return method found, or null if none found
*/
Method lookupVisitMethod(
Class<? extends R> visitorClass,
Class<? extends E> visiteeClass,
String visitMethodName,
List<Class> additionalParameterTypes);
/**
* Looks up a visit method.
*
* @param visitorClass class of object whose visit method is to be invoked
* @param visiteeClass class of object to be passed as a parameter to the
* visit method
* @param visitMethodName name of visit method
* @return method found, or null if none found
*/
Method lookupVisitMethod(
Class<? extends R> visitorClass,
Class<? extends E> visiteeClass,
String visitMethodName);
/**
* Implements the {@link org.apache.calcite.util.Glossary#VISITOR_PATTERN} via
* reflection. The basic technique is taken from <a
* href="http://www.javaworld.com/javaworld/javatips/jw-javatip98.html">a
* Javaworld article</a>. For an example of how to use it, see
* {@code ReflectVisitorTest}.
*
* <p>Visit method lookup follows the same rules as if compile-time resolution
* for VisitorClass.visit(VisiteeClass) were performed. An ambiguous match due
* to multiple interface inheritance results in an IllegalArgumentException. A
* non-match is indicated by returning false.</p>
*
* @param visitor object whose visit method is to be invoked
* @param visitee object to be passed as a parameter to the visit
* method
* @param visitMethodName name of visit method, e.g. "visit"
* @return true if a matching visit method was found and invoked
*/
boolean invokeVisitor(
R visitor,
E visitee,
String visitMethodName);
}