[jboss-cvs] jboss-seam/src/main/org/jboss/seam/deployment ...
Norman Richards
norman.richards at jboss.com
Wed Nov 15 01:12:46 EST 2006
User: nrichards
Date: 06/11/15 01:12:46
Modified: src/main/org/jboss/seam/deployment Scanner.java
Added: src/main/org/jboss/seam/deployment ComponentScanner.java
NamespaceScanner.java
Log:
JBSEAM-502: add package namespaces for simplified xml configuration
Revision Changes Path
1.17 +19 -57 jboss-seam/src/main/org/jboss/seam/deployment/Scanner.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Scanner.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/deployment/Scanner.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- Scanner.java 14 Nov 2006 00:15:01 -0000 1.16
+++ Scanner.java 15 Nov 2006 06:12:46 -0000 1.17
@@ -1,4 +1,4 @@
-//$Id: Scanner.java,v 1.16 2006/11/14 00:15:01 gavin Exp $
+//$Id: Scanner.java,v 1.17 2006/11/15 06:12:46 nrichards Exp $
package org.jboss.seam.deployment;
import java.io.DataInputStream;
@@ -22,13 +22,12 @@
import org.apache.commons.logging.LogFactory;
import org.jboss.seam.annotations.Name;
-public class Scanner
+public abstract class Scanner
{
-
private static final Log log = LogFactory.getLog(Scanner.class);
- private String resourceName;
- private ClassLoader classLoader;
+ protected String resourceName;
+ protected ClassLoader classLoader;
public Scanner(String resourceName)
{
@@ -47,12 +46,8 @@
.replace('/', '.').replace('\\', '.');
}
- /**
- * Returns only Seam components (ie: classes annotated with @Name)
- */
- public Set<Class<Object>> getClasses()
- {
- Set<Class<Object>> result = new HashSet<Class<Object>>();
+
+ protected void scan() {
Enumeration<URL> urls;
try
{
@@ -60,7 +55,7 @@
}
catch (IOException ioe) {
log.warn("could not read: " + resourceName, ioe);
- return result;
+ return;
}
while (urls.hasMoreElements())
@@ -87,21 +82,21 @@
File file = new File(urlPath);
if ( file.isDirectory() )
{
- handleDirectory(result, file, null);
+ handleDirectory(file, null);
}
else
{
- handleArchive(result, file);
+ handleArchive(file);
}
}
catch (IOException ioe) {
log.warn("could not read entries", ioe);
}
}
- return result;
}
- private void handleArchive(Set<Class<Object>> result, File file) throws ZipException, IOException
+
+ private void handleArchive(File file) throws ZipException, IOException
{
log.debug("archive: " + file);
ZipFile zip = new ZipFile(file);
@@ -111,11 +106,11 @@
ZipEntry entry = entries.nextElement();
String name = entry.getName();
log.debug("found: " + name);
- handleItem(result, name);
+ handleItem(name);
}
}
- private void handleDirectory(Set<Class<Object>> result, File file, String path)
+ private void handleDirectory(File file, String path)
{
log.debug("directory: " + file);
for ( File child: file.listFiles() )
@@ -124,51 +119,18 @@
child.getName() : path + '/' + child.getName();
if ( child.isDirectory() )
{
- handleDirectory( result, child, newPath );
+ handleDirectory(child, newPath);
}
else
{
- handleItem( result, newPath );
+ handleItem(newPath);
}
}
}
- private void handleItem(Set<Class<Object>> result, String name)
- {
- if (
- name.endsWith(".class") &&
- !name.startsWith("org/jboss/seam/core")
- && !name.startsWith("org/jboss/seam/persistence")
- && !name.startsWith("org/jboss/seam/debug")
- && !name.startsWith("org/jboss/seam/theme")
- )
- {
- String classname = filenameToClassname(name);
- String filename = Scanner.componentFilename(name);
- try
- {
- ClassFile classFile = getClassFile(name);
- if ( hasAnnotation(classFile, Name.class) || classLoader.getResources(filename).hasMoreElements() )
- {
- result.add( (Class<Object>) classLoader.loadClass(classname) );
- }
- }
- catch (ClassNotFoundException cnfe)
- {
- log.debug( "could not load class: " + classname, cnfe );
- }
- catch (NoClassDefFoundError ncdfe)
- {
- log.debug( "could not load class (missing dependency): " + classname, ncdfe );
- }
- catch (IOException ioe)
- {
- log.debug( "could not load classfile: " + classname, ioe );
- }
- }
- }
+ abstract void handleItem(String name);
- private ClassFile getClassFile(String name) throws IOException
+ protected ClassFile getClassFile(String name) throws IOException
{
InputStream stream = classLoader.getResourceAsStream(name);
DataInputStream dstream = new DataInputStream(stream);
@@ -184,7 +146,7 @@
}
}
- private boolean hasAnnotation(ClassFile cf, Class<? extends Annotation> annotationType)
+ protected boolean hasAnnotation(ClassFile cf, Class<? extends Annotation> annotationType)
{
AnnotationsAttribute visible = (AnnotationsAttribute) cf.getAttribute( AnnotationsAttribute.visibleTag );
if ( visible != null )
1.1 date: 2006/11/15 06:12:46; author: nrichards; state: Exp;jboss-seam/src/main/org/jboss/seam/deployment/ComponentScanner.java
Index: ComponentScanner.java
===================================================================
package org.jboss.seam.deployment;
import org.jboss.seam.annotations.Name;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import javassist.bytecode.ClassFile;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ComponentScanner
extends Scanner
{
private static final Log log = LogFactory.getLog(ComponentScanner.class);
private Set<Class<Object>> classes;
public ComponentScanner(String resourceName)
{
super(resourceName);
}
public ComponentScanner(String resourceName, ClassLoader classLoader)
{
super(resourceName,classLoader);
}
/**
* Returns only Seam components (ie: classes annotated with @Name)
*/
public Set<Class<Object>> getClasses()
{
if (classes == null) {
classes = new HashSet<Class<Object>>();
scan();
}
return classes;
}
protected void handleItem(String name)
{
if (name.endsWith(".class") &&
!name.startsWith("org/jboss/seam/core") &&
!name.startsWith("org/jboss/seam/persistence") &&
!name.startsWith("org/jboss/seam/debug") &&
!name.startsWith("org/jboss/seam/theme"))
{
String classname = filenameToClassname(name);
String filename = Scanner.componentFilename(name);
try {
ClassFile classFile = getClassFile(name);
if (hasAnnotation(classFile, Name.class) ||
classLoader.getResources(filename).hasMoreElements() )
{
classes.add( (Class<Object>) classLoader.loadClass(classname) );
}
} catch (ClassNotFoundException cnfe) {
log.debug( "could not load class: " + classname, cnfe );
} catch (NoClassDefFoundError ncdfe) {
log.debug( "could not load class (missing dependency): " + classname, ncdfe );
} catch (IOException ioe) {
log.debug( "could not load classfile: " + classname, ioe );
}
}
}
}
1.1 date: 2006/11/15 06:12:46; author: nrichards; state: Exp;jboss-seam/src/main/org/jboss/seam/deployment/NamespaceScanner.java
Index: NamespaceScanner.java
===================================================================
package org.jboss.seam.deployment;
import org.jboss.seam.annotations.Namespace;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import javassist.bytecode.ClassFile;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class NamespaceScanner
extends Scanner
{
private static final Log log = LogFactory.getLog(NamespaceScanner.class);
private Set<Package> packages;
public NamespaceScanner(String resourceName)
{
super(resourceName);
}
public NamespaceScanner(String resourceName, ClassLoader classLoader)
{
super(resourceName,classLoader);
}
/**
* Returns packages with @Namespace declarations
*/
public Set<Package> getPackages()
{
if (packages == null) {
packages = new HashSet<Package>();
scan();
}
return packages;
}
public static String filenameToPackageName(String filename)
{
return filename.substring(0, filename.lastIndexOf("/package-info.class"))
.replace('/', '.').replace('\\', '.');
}
protected void handleItem(String name)
{
if (name.endsWith("/package-info.class")) {
String packageName = filenameToPackageName(name);
// XXX - can't get package info from a classloader directly?
Package pkg = Package.getPackage(packageName);
if (pkg.getAnnotation(Namespace.class) != null) {
packages.add(pkg);
}
}
}
}
More information about the jboss-cvs-commits
mailing list