You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by rs...@apache.org on 2002/08/28 04:49:51 UTC
cvs commit: jakarta-commons/discovery/src/java/org/apache/commons/discovery ResourceDiscovery.java ClassDiscovery.java ServiceDiscovery.java
rsitze 2002/08/27 19:49:51
Modified: discovery/src/java/org/apache/commons/discovery/log
DiscoveryLogFactory.java
discovery/src/java/org/apache/commons/discovery
ResourceDiscovery.java ClassDiscovery.java
ServiceDiscovery.java
Added: discovery/src/java/org/apache/commons/discovery/tools
ClassUtils.java
Log:
Moved code to 'detect' public static method to tooling.
Revision Changes Path
1.1 jakarta-commons/discovery/src/java/org/apache/commons/discovery/tools/ClassUtils.java
Index: ClassUtils.java
===================================================================
/*
* $Header$
* $Revision$
* $Date$
*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999-2002 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", "Commons", 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 apache@apache.org.
*
* 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/>.
*
*/
package org.apache.commons.discovery.tools;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.apache.commons.discovery.log.DiscoveryLogFactory;
import org.apache.commons.logging.Log;
/**
* @author Richard A. Sitze
*/
public class ClassUtils {
private static Log log = DiscoveryLogFactory.newLog(ClassUtils.class);
public static void setLog(Log _log) {
log = _log;
}
/**
* Get package name.
* Not all class loaders 'keep' package information,
* in which case Class.getPackage() returns null.
* This means that calling Class.getPackage().getName()
* is unreliable at best.
*/
public static String getPackageName(Class clazz) {
Package clazzPackage = clazz.getPackage();
String packageName;
if (clazzPackage != null) {
packageName = clazzPackage.getName();
} else {
String clazzName = clazz.getName();
packageName = new String(clazzName.toCharArray(), 0, clazzName.lastIndexOf('.'));
}
return packageName;
}
/**
* @return Method 'public static returnType methodName(paramTypes)',
* if found to be <strong>directly</strong> implemented by clazz.
*/
public static Method findPublicStaticMethod(Class clazz,
Class returnType,
String methodName,
Class[] paramTypes) {
boolean problem = false;
Method method = null;
// verify '<methodName>(<paramTypes>)' is directly in class.
try {
method = clazz.getDeclaredMethod(methodName, paramTypes);
} catch(NoSuchMethodException e) {
problem = true;
log.debug("Class " + clazz.getName() + ": missing method '" + methodName + "(...)", e);
}
// verify 'public static <returnType>'
if (!problem &&
!(Modifier.isPublic(method.getModifiers()) &&
Modifier.isStatic(method.getModifiers()) &&
method.getReturnType() == returnType)) {
if (log.isDebugEnabled()) {
if (!Modifier.isPublic(method.getModifiers())) {
log.debug(methodName + "() is not public");
}
if (!Modifier.isStatic(method.getModifiers())) {
log.debug(methodName + "() is not static");
}
if (method.getReturnType() != returnType) {
log.debug("Method returns: " + method.getReturnType().getName() + "@@" + method.getReturnType().getClassLoader());
log.debug("Should return: " + returnType.getName() + "@@" + returnType.getClassLoader());
}
}
problem = true;
method = null;
}
return method;
}
}
1.2 +8 -19 jakarta-commons/discovery/src/java/org/apache/commons/discovery/log/DiscoveryLogFactory.java
Index: DiscoveryLogFactory.java
===================================================================
RCS file: /home/cvs/jakarta-commons/discovery/src/java/org/apache/commons/discovery/log/DiscoveryLogFactory.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DiscoveryLogFactory.java 26 Aug 2002 13:08:45 -0000 1.1
+++ DiscoveryLogFactory.java 28 Aug 2002 02:49:50 -0000 1.2
@@ -68,6 +68,7 @@
import java.util.Hashtable;
import org.apache.commons.discovery.DiscoveryException;
+import org.apache.commons.discovery.tools.ClassUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -110,25 +111,12 @@
* Required to implement 'public static void setLog(Log)'
*/
try {
- boolean problem = false;
- Method setLog = null;
+ Method setLog = ClassUtils.findPublicStaticMethod(clazz,
+ void.class,
+ "setLog",
+ setLogParamClasses);
- // verify 'setLog(Log)' is in class
- try {
- setLog = clazz.getDeclaredMethod("setLog", setLogParamClasses);
- } catch(NoSuchMethodException e) {
- problem = true;
- }
-
- // verify 'public static void'
- if (!problem &&
- !(Modifier.isPublic(setLog.getModifiers()) &&
- Modifier.isStatic(setLog.getModifiers()) &&
- setLog.getReturnType() == void.class)) {
- problem = true;
- }
-
- if (problem) {
+ if (setLog == null) {
String msg = "Internal Error: " + clazz.getName() + " required to implement 'public static void setLog(Log)'";
log.fatal(msg);
throw new DiscoveryException(msg);
@@ -178,7 +166,8 @@
Method setLog = null;
- // verify 'setLog(Log)'
+ // invoke 'setLog(Log)'.. we already know it's 'public static',
+ // have verified parameters, and return type..
try {
setLog = clazz.getMethod("setLog", setLogParamClasses);
} catch(Exception e) {
1.12 +3 -4 jakarta-commons/discovery/src/java/org/apache/commons/discovery/ResourceDiscovery.java
Index: ResourceDiscovery.java
===================================================================
RCS file: /home/cvs/jakarta-commons/discovery/src/java/org/apache/commons/discovery/ResourceDiscovery.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ResourceDiscovery.java 26 Aug 2002 21:57:56 -0000 1.11
+++ ResourceDiscovery.java 28 Aug 2002 02:49:50 -0000 1.12
@@ -81,6 +81,9 @@
public class ResourceDiscovery
{
private static Log log = DiscoveryLogFactory.newLog(ResourceDiscovery.class);
+ public static void setLog(Log _log) {
+ log = _log;
+ }
/**
* this doesn't buy anything except +/- style (subjective).
@@ -192,9 +195,5 @@
return null;
}
};
- }
-
- public static void setLog(Log _log) {
- log = _log;
}
}
1.6 +3 -4 jakarta-commons/discovery/src/java/org/apache/commons/discovery/ClassDiscovery.java
Index: ClassDiscovery.java
===================================================================
RCS file: /home/cvs/jakarta-commons/discovery/src/java/org/apache/commons/discovery/ClassDiscovery.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ClassDiscovery.java 26 Aug 2002 21:57:56 -0000 1.5
+++ ClassDiscovery.java 28 Aug 2002 02:49:50 -0000 1.6
@@ -80,6 +80,9 @@
public class ClassDiscovery extends ResourceDiscovery
{
private static Log log = DiscoveryLogFactory.newLog(ClassDiscovery.class);
+ public static void setLog(Log _log) {
+ log = _log;
+ }
protected static final String SERVICE_HOME = "META-INF/services/";
@@ -155,9 +158,5 @@
return null;
}
};
- }
-
- public static void setLog(Log _log) {
- log = _log;
}
}
1.12 +3 -4 jakarta-commons/discovery/src/java/org/apache/commons/discovery/ServiceDiscovery.java
Index: ServiceDiscovery.java
===================================================================
RCS file: /home/cvs/jakarta-commons/discovery/src/java/org/apache/commons/discovery/ServiceDiscovery.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ServiceDiscovery.java 26 Aug 2002 21:57:56 -0000 1.11
+++ ServiceDiscovery.java 28 Aug 2002 02:49:51 -0000 1.12
@@ -96,6 +96,9 @@
public class ServiceDiscovery extends ClassDiscovery
{
private static Log log = DiscoveryLogFactory.newLog(ServiceDiscovery.class);
+ public static void setLog(Log _log) {
+ log = _log;
+ }
protected static final String SERVICE_HOME = "META-INF/services/";
@@ -252,9 +255,5 @@
}
return results;
- }
-
- public static void setLog(Log _log) {
- log = _log;
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>