dlr 01/09/11 10:14:03
Modified: src/java/org/apache/velocity/util/introspection
Introspector.java
Log:
JavaDoc improvements.
Revision Changes Path
1.12 +207 -1
jakarta-velocity/src/java/org/apache/velocity/util/introspection/Introspector.java
Index: Introspector.java
===================================================================
RCS file:
/home/cvs/jakarta-velocity/src/java/org/apache/velocity/util/introspection/Introspector.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -u -r1.11 -r1.12
--- Introspector.java 2001/09/10 10:36:09 1.11
+++ Introspector.java 2001/09/11 17:14:03 1.12
@@ -1 +1,207 @@
-package org.apache.velocity.util.introspection;
/*
* The Apache Software License,
Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
*
reserved.
*
* Redistribution and use in source and binary forms, with or without
*
modification, are permitted provided that the following conditions
* are met:
*
*
1. Redistributions of source code must retain the above copyright
* notice, this
list of conditions and the following disclaimer.
*
* 2. Redistributions in binary
form must reproduce the above copyright
* notice, this list of conditions and the
following disclaimer in
* the documentation and/or other materials provided with
the
* distribution.
*
* 3. The end-user documentation included with the
redistribution, if
* any, must include the following acknowlegement:
*
"This product includes software developed by the
* Apache Software Foundation
(http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the
software itself,
* if and wherever such third-party acknowlegements normally
appear.
*
* 4. The names "The Jakarta Project", "Velocity", and "Apache Software
*
Foundation" must not be used to endorse or promote products derived
* from this
software without prior written permission. For written
* permission, please
contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be
called "Apache"
* nor may "Apache" appear in their names without prior written
*
permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY
EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
*
DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
====================================================================
*
* This
software consists of voluntary contributions made by many
* individuals on behalf of
the Apache Software Foundation. For more
* information on the Apache Software
Foundation, please see
* <http://www.apache.org/>.
*/
import java.util.*;
import
java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import
org.apache.velocity.runtime.RuntimeServices;
/**
* This basic function of this class
is to return a Method
* object for a particular class given the name of a method
*
and the parameters to the method in the form of an Object[]
*
* The first time the
Introspector sees a
* class it creates a class method map for the
* class in
question. Basically the class method map
* is a Hastable where Method objects are
keyed by a
* concatenation of the method name and the names of
* classes that make
up the parameters.
*
* For example, a method with the following signature:
*
*
public void method(String a, StringBuffer b)
*
* would be mapped by the key:
*
*
"method" + "java.lang.String" + "java.lang.StringBuffer"
*
* This mapping is
performed for all the methods in a class
* and stored for
* @author <a
href="mailto:[EMAIL PROTECTED]">Jason van Zyl</a>
* @author <a
href="mailto:[EMAIL PROTECTED]">Bob McWhirter</a>
* @author <a
href="mailto:[EMAIL PROTECTED]">Attila Szegedi</a>
* @author <a
href="mailto:[EMAIL PROTECTED]">Paulo Gaspar</a>
* @version $Id:
Introspector.java,v 1.11 2001/09/10 10:36:09 geirm Exp $
*/
public class Introspector
{
private RuntimeServices rsvc = null;
/*
* Holds the method maps for
the classes we know about,
* keyed by Class
*/
private final Map
classMethodMaps = new HashMap();
/*
* Holds the qualified class name to
Class mapping
*/
private final Map classByName = new HashMap();
/**
* Recieves our RuntimeServices object
*/
public void init( RuntimeServices r
)
{
this.rsvc = r;
}
public Method getMethod(Class c, String
name, Object[] params)
throws Exception
{
if (c == null)
{
throw new Exception (
"Introspector.getMethod(): Class
method key was null: " + name );
}
ClassMap classMap
= null;
synchronized(classMethodMaps)
{
classMap
= (ClassMap)classMethodMaps.get(c);
/*
* if we
don't have this, check to see if we have it
* by name. if so, then we
have a classloader change
* so dump our caches.
*/
if ( classMap == null)
{
Class
cachedClass = (Class) classByName.get( c.getName() );
if ( cachedClass != null)
{
clearCache();
rsvc.info("Introspector : detected classloader change. Dumping cache.");
}
classMap = createClassMap(c);
}
}
return classMap.findMethod(name, params);
}
/**
* Creates a class map for specific class and registers it in the
*
cache. Also adds the qualified name to the name->class map
* for later
Classloader change detection.
*/
private ClassMap createClassMap(Class c)
{
ClassMap classMap = new ClassMap(c);
classMethodMaps.put( c,
classMap);
classByName.put(c.getName(), c);
return classMap;
}
/**
* Clears the classmap and classname
* caches
*/
private void
clearCache()
{
classMethodMaps.clear();
classByName.clear();
}
/**
* Checks whether the provided
object implements a given method.
*
*
* @param object The object to
check.
* @param methodName The method to check for.
* @return
Whether the method is implemented.
*/
public boolean implementsMethod(Object
object, String methodName)
{
int m;
Method[] methods =
object.getClass().getMethods();
for (m = 0 ; m < methods.length ;
++m)
{
if (methodName.equals(methods[m].getName()))
{
break;
}
}
return (m <
methods.length);
}
}
\ No newline at end of file
+package org.apache.velocity.util.introspection;
+
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Velocity", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact [EMAIL PROTECTED]
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+import java.util.*;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import org.apache.velocity.runtime.RuntimeServices;
+
+/**
+ * This basic function of this class is to return a Method
+ * object for a particular class given the name of a method
+ * and the parameters to the method in the form of an Object[]
+ *
+ * The first time the Introspector sees a
+ * class it creates a class method map for the
+ * class in question. Basically the class method map
+ * is a Hastable where Method objects are keyed by a
+ * concatenation of the method name and the names of
+ * classes that make up the parameters.
+ *
+ * For example, a method with the following signature:
+ *
+ * public void method(String a, StringBuffer b)
+ *
+ * would be mapped by the key:
+ *
+ * "method" + "java.lang.String" + "java.lang.StringBuffer"
+ *
+ * This mapping is performed for all the methods in a class
+ * and stored for
+ * @author <a href="mailto:[EMAIL PROTECTED]">Jason van Zyl</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Bob McWhirter</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Attila Szegedi</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Paulo Gaspar</a>
+ * @version $Id: Introspector.java,v 1.12 2001/09/11 17:14:03 dlr Exp $
+ */
+public class Introspector
+{
+ private RuntimeServices rsvc = null;
+
+ /**
+ * Holds the method maps for the classes we know about, keyed by
+ * Class object.
+ */
+ private final Map classMethodMaps = new HashMap();
+
+ /**
+ * Holds the qualified class name to Class object mapping.
+ */
+ private final Map classByName = new HashMap();
+
+ /**
+ * Recieves our RuntimeServices object
+ */
+ public void init( RuntimeServices r )
+ {
+ this.rsvc = r;
+ }
+
+ /**
+ * Gets the method defined by <code>name</code> and
+ * <code>params</code> for the Class <code>c</code>.
+ *
+ * @return The desired Method object.
+ */
+ public Method getMethod(Class c, String name, Object[] params)
+ throws Exception
+ {
+ if (c == null)
+ {
+ throw new Exception (
+ "Introspector.getMethod(): Class method key was null: " + name );
+ }
+
+ ClassMap classMap = null;
+
+ synchronized(classMethodMaps)
+ {
+ classMap = (ClassMap)classMethodMaps.get(c);
+
+ /*
+ * if we don't have this, check to see if we have it
+ * by name. if so, then we have a classloader change
+ * so dump our caches.
+ */
+
+ if (classMap == null)
+ {
+ Class cachedClass = (Class) classByName.get( c.getName() );
+
+ if (cachedClass != null)
+ {
+ clearCache();
+ rsvc.info("Introspector : detected classloader change. Dumping
cache.");
+ }
+
+ classMap = createClassMap(c);
+ }
+ }
+
+ return classMap.findMethod(name, params);
+ }
+
+ /**
+ * Creates a class map for specific class and registers it in the
+ * cache. Also adds the qualified name to the name->class map
+ * for later Classloader change detection.
+ */
+ private ClassMap createClassMap(Class c)
+ {
+ ClassMap classMap = new ClassMap(c);
+ classMethodMaps.put(c, classMap);
+ classByName.put(c.getName(), c);
+
+ return classMap;
+ }
+
+ /**
+ * Clears the classmap and classname
+ * caches
+ */
+ private void clearCache()
+ {
+ classMethodMaps.clear();
+ classByName.clear();
+ }
+
+ /**
+ * Checks whether the provided object implements a given method.
+ *
+ *
+ * @param object The object to check.
+ * @param methodName The method to check for.
+ * @return Whether the method is implemented.
+ */
+ public boolean implementsMethod(Object object, String methodName)
+ {
+ int m;
+
+ Method[] methods = object.getClass().getMethods();
+
+ for (m = 0 ; m < methods.length ; ++m)
+ {
+ if (methodName.equals(methods[m].getName()))
+ {
+ break;
+ }
+ }
+
+ return (m < methods.length);
+ }
+}