Author: dblevins
Date: Wed Jun  6 02:22:26 2012
New Revision: 1346714

URL: http://svn.apache.org/viewvc?rev=1346714&view=rev
Log:
Move the Info objects into a model package

Added:
    
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/
    
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Annotatable.java
    
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/AnnotationInfo.java
    
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/ClassInfo.java
    
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/FieldInfo.java
    
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Info.java
    
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/MethodInfo.java
    
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/PackageInfo.java
Modified:
    
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/AnnotationFinder.java

Modified: 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/AnnotationFinder.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/AnnotationFinder.java?rev=1346714&r1=1346713&r2=1346714&view=diff
==============================================================================
--- 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/AnnotationFinder.java
 (original)
+++ 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/AnnotationFinder.java
 Wed Jun  6 02:22:26 2012
@@ -25,7 +25,12 @@ import org.apache.commons.classscan.find
 import org.apache.commons.classscan.finder.meta.MetaAnnotatedClass;
 import org.apache.commons.classscan.finder.meta.MetaAnnotatedField;
 import org.apache.commons.classscan.finder.meta.MetaAnnotatedMethod;
-import org.apache.commons.classscan.finder.util.Classes;
+import org.apache.commons.classscan.finder.model.AnnotationInfo;
+import org.apache.commons.classscan.finder.model.ClassInfo;
+import org.apache.commons.classscan.finder.model.FieldInfo;
+import org.apache.commons.classscan.finder.model.Info;
+import org.apache.commons.classscan.finder.model.MethodInfo;
+import org.apache.commons.classscan.finder.model.PackageInfo;
 import org.apache.commons.classscan.finder.util.SingleLinkedList;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Attribute;
@@ -41,10 +46,8 @@ import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Target;
-import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
-import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -136,11 +139,11 @@ public class AnnotationFinder implements
     }
 
     private void readClassDef(ClassInfo info) {
-        classInfos.put(info.name, info);
+        classInfos.put(info.getName(), info);
         index(info);
-        index(info.constructors);
-        index(info.methods);
-        index(info.fields);
+        index(info.getConstructors());
+        index(info.getMethods());
+        index(info.getFields());
     }
 
     private void resolveAnnotations(AnnotationFinder parent, List<String> 
scanned) {
@@ -306,43 +309,43 @@ public class AnnotationFinder implements
     }
 
     private void linkParent(ClassInfo classInfo) {
-        if (classInfo.superType == null) return;
-        if (classInfo.superType.equals("java.lang.Object")) return;
+        if (classInfo.getSuperType() == null) return;
+        if (classInfo.getSuperType().equals("java.lang.Object")) return;
 
-        ClassInfo parentInfo = classInfo.superclassInfo;
+        ClassInfo parentInfo = classInfo.getSuperclassInfo();
 
         if (parentInfo == null) {
 
-            parentInfo = classInfos.get(classInfo.superType);
+            parentInfo = classInfos.get(classInfo.getSuperType());
 
             if (parentInfo == null) {
 
-                if (classInfo.clazz != null) {
-                    readClassDef(((Class<?>) classInfo.clazz).getSuperclass());
+                if (classInfo.getClazz() != null) {
+                    readClassDef(((Class<?>) 
classInfo.getClazz()).getSuperclass());
                 } else {
-                    readClassDef(classInfo.superType);
+                    readClassDef(classInfo.getSuperType());
                 }
 
-                parentInfo = classInfos.get(classInfo.superType);
+                parentInfo = classInfos.get(classInfo.getSuperType());
 
                 if (parentInfo == null) return;
 
                 linkParent(parentInfo);
             }
 
-            classInfo.superclassInfo = parentInfo;
+            classInfo.setSuperclassInfo(parentInfo);
         }
 
-        if (!parentInfo.subclassInfos.contains(classInfo)) {
-            parentInfo.subclassInfos.add(classInfo);
+        if (!parentInfo.getSubclassInfos().contains(classInfo)) {
+            parentInfo.getSubclassInfos().add(classInfo);
         }
     }
 
     private void linkInterfaces(ClassInfo classInfo) {
         final List<ClassInfo> infos = new ArrayList<ClassInfo>();
 
-        if (classInfo.clazz != null) {
-            final Class<?>[] interfaces = classInfo.clazz.getInterfaces();
+        if (classInfo.getClazz() != null) {
+            final Class<?>[] interfaces = classInfo.getClazz().getInterfaces();
 
             for (Class<?> clazz : interfaces) {
                 ClassInfo interfaceInfo = classInfos.get(clazz.getName());
@@ -358,7 +361,7 @@ public class AnnotationFinder implements
                 }
             }
         } else {
-            for (String className : classInfo.interfaces) {
+            for (String className : classInfo.getInterfaces()) {
                 ClassInfo interfaceInfo = classInfos.get(className);
 
                 if (interfaceInfo == null) {
@@ -850,7 +853,7 @@ public class AnnotationFinder implements
 
     private <T> void findSubclasses(ClassInfo classInfo, List<Class<? extends 
T>> found, Class<T> clazz) {
 
-        for (ClassInfo subclassInfo : classInfo.subclassInfos) {
+        for (ClassInfo subclassInfo : classInfo.getSubclassInfos()) {
 
             try {
                 found.add(subclassInfo.get().asSubclass(clazz));
@@ -872,7 +875,7 @@ public class AnnotationFinder implements
 
             try {
 
-                if (clazz.getName().equals(classInfo.superType)) {
+                if (clazz.getName().equals(classInfo.getSuperType())) {
 
                     if (clazz.isAssignableFrom(classInfo.get())) {
 
@@ -930,7 +933,7 @@ public class AnnotationFinder implements
 
         for (ClassInfo classInfo : classInfos.values()) {
 
-            if (classInfo.interfaces.contains(interfaceName)) {
+            if (classInfo.getInterfaces().contains(interfaceName)) {
 
                 infos.add(classInfo);
 
@@ -940,7 +943,7 @@ public class AnnotationFinder implements
 
                     if (clazz.isInterface() && !clazz.isAnnotation()) {
 
-                        infos.addAll(collectImplementations(classInfo.name));
+                        
infos.addAll(collectImplementations(classInfo.getName()));
 
                     }
 
@@ -1029,394 +1032,6 @@ public class AnnotationFinder implements
         }
     }
 
-    /**
-     * This class has the following subclasses:
-     *
-     *  PackageInfo
-     *  ClassInfo
-     *  MethodInfo
-     *  FieldInfo
-     *  AnnotationInfo
-     *
-     * The internal Data Model objects.  These could be promoted to top-level 
objects
-     *
-     * A bit of tweaking would be required to make them static before 
promoting them
-     */
-    public static class Annotatable {
-        private final List<AnnotationInfo> annotations = new 
ArrayList<AnnotationInfo>();
-
-        public Annotatable(AnnotatedElement element) {
-            for (Annotation annotation : getAnnotations(element)) {
-                annotations.add(new 
AnnotationInfo(annotation.annotationType().getName()));
-            }
-        }
-
-        public Annotatable() {
-        }
-
-        public Annotation[] getDeclaredAnnotations() {
-            return new Annotation[0];
-        }
-
-        public List<AnnotationInfo> getAnnotations() {
-            return annotations;
-        }
-
-        /**
-         * Utility method to get around some errors caused by
-         * interactions between the Equinox class loaders and
-         * the OpenJPA transformation process.  There is a window
-         * where the OpenJPA transformation process can cause
-         * an annotation being processed to get defined in a
-         * classloader during the actual defineClass call for
-         * that very class (e.g., recursively).  This results in
-         * a LinkageError exception.  If we see one of these,
-         * retry the request.  Since the annotation will be
-         * defined on the second pass, this should succeed.  If
-         * we get a second exception, then it's likely some
-         * other problem.
-         *
-         * @param element The AnnotatedElement we need information for.
-         * @return An array of the Annotations defined on the element.
-         */
-        private Annotation[] getAnnotations(AnnotatedElement element) {
-            try {
-                return element.getAnnotations();
-            } catch (LinkageError e) {
-                return element.getAnnotations();
-            }
-        }
-
-    }
-
-    public static interface Info {
-
-        String getName();
-
-        List<AnnotationInfo> getAnnotations();
-
-        Annotation[] getDeclaredAnnotations();
-    }
-
-    public static class PackageInfo extends Annotatable implements Info {
-        private final String name;
-        private final ClassInfo info;
-        private final Package pkg;
-
-        public PackageInfo(Package pkg) {
-            super(pkg);
-            this.pkg = pkg;
-            this.name = pkg.getName();
-            this.info = null;
-        }
-
-        public PackageInfo(Archive archive, String name) {
-            info = new ClassInfo(archive, name, null);
-            this.name = name;
-            this.pkg = null;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public Package get() throws ClassNotFoundException {
-            return (pkg != null) ? pkg : info.get().getPackage();
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-
-            final PackageInfo that = (PackageInfo) o;
-
-            if (name != null ? !name.equals(that.name) : that.name != null) 
return false;
-
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            return name != null ? name.hashCode() : 0;
-        }
-    }
-
-    public static class ClassInfo extends Annotatable implements Info {
-        private String name;
-        private final List<MethodInfo> methods = new 
SingleLinkedList<MethodInfo>();
-        private final List<MethodInfo> constructors = new 
SingleLinkedList<MethodInfo>();
-        private String superType;
-        private ClassInfo superclassInfo;
-        private final List<ClassInfo> subclassInfos = new 
SingleLinkedList<ClassInfo>();
-        private final List<String> interfaces = new SingleLinkedList<String>();
-        private final List<FieldInfo> fields = new 
SingleLinkedList<FieldInfo>();
-        private Class<?> clazz;
-
-        /**
-         * Allows lazy loading of the related java class
-         */
-        private Archive archive;
-
-        public ClassInfo(Class clazz) {
-            super(clazz);
-            this.clazz = clazz;
-            this.name = clazz.getName();
-
-            final Class superclass = clazz.getSuperclass();
-
-            this.superType = superclass != null ? superclass.getName() : null;
-            for (Class intrface : clazz.getInterfaces()) {
-                this.interfaces.add(intrface.getName());
-            }
-        }
-
-        public ClassInfo(Archive archive, String name, String superType) {
-            this.name = name;
-            this.superType = superType;
-            this.archive = archive;
-        }
-
-        public String getPackageName() {
-            return name.indexOf(".") > 0 ? name.substring(0, 
name.lastIndexOf(".")) : "";
-        }
-
-        public List<MethodInfo> getConstructors() {
-            return constructors;
-        }
-
-        public List<String> getInterfaces() {
-            return interfaces;
-        }
-
-        public List<FieldInfo> getFields() {
-            return fields;
-        }
-
-        public List<MethodInfo> getMethods() {
-            return methods;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public String getSuperType() {
-            return superType;
-        }
-
-        public boolean isAnnotation() {
-            return "java.lang.Object".equals(superType) && interfaces.size() 
== 1 && "java.lang.annotation.Annotation".equals(interfaces.get(0));
-        }
-
-        public Class<?> get() throws ClassNotFoundException {
-            if (clazz != null) return clazz;
-            final String fixedName = name.replaceFirst("<.*>", "");
-            this.clazz = archive.loadClass(fixedName);
-            return clazz;
-        }
-
-        public String toString() {
-            return name;
-        }
-    }
-
-    public static class MethodInfo extends Annotatable implements Info {
-        private final ClassInfo declaringClass;
-        private final String name;
-        private final List<List<AnnotationInfo>> parameterAnnotations = new 
ArrayList<List<AnnotationInfo>>();
-        private final List<String> parameters = new SingleLinkedList<String>();
-        private Member method;
-
-        public MethodInfo(ClassInfo info, Constructor constructor) {
-            super(constructor);
-            this.declaringClass = info;
-            this.name = "<init>";
-        }
-
-        public MethodInfo(ClassInfo info, Method method) {
-            super(method);
-            this.declaringClass = info;
-            this.name = method.getName();
-            this.method = method;
-        }
-
-        public MethodInfo(ClassInfo declarignClass, String name, List<String> 
params) {
-            this.declaringClass = declarignClass;
-            this.name = name;
-            this.parameters.addAll(params);
-        }
-
-        @Override
-        public Annotation[] getDeclaredAnnotations() {
-            super.getDeclaredAnnotations();
-            try {
-                return ((AnnotatedElement) get()).getDeclaredAnnotations();
-            } catch (ClassNotFoundException e) {
-                return super.getDeclaredAnnotations();
-            }
-        }
-
-        public boolean isConstructor() {
-            return getName().equals("<init>");
-        }
-
-        public List<List<AnnotationInfo>> getParameterAnnotations() {
-            return parameterAnnotations;
-        }
-
-        public List<AnnotationInfo> getParameterAnnotations(int index) {
-            if (index >= parameterAnnotations.size()) {
-                for (int i = parameterAnnotations.size(); i <= index; i++) {
-                    final List<AnnotationInfo> annotationInfos = new 
ArrayList<AnnotationInfo>();
-                    parameterAnnotations.add(i, annotationInfos);
-                }
-            }
-            return parameterAnnotations.get(index);
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public ClassInfo getDeclaringClass() {
-            return declaringClass;
-        }
-
-        public String toString() {
-            return declaringClass + "@" + name;
-        }
-
-        public Member get() throws ClassNotFoundException {
-            if (method == null) {
-                method = toMethod();
-            }
-
-            return method;
-        }
-
-        private Method toMethod() throws ClassNotFoundException {
-            Class<?> clazz = this.declaringClass.get();
-            final List<Class> parameterTypes = new ArrayList<Class>();
-
-            for (String paramType : parameters) {
-                try {
-                    parameterTypes.add(Classes.forName(paramType, 
clazz.getClassLoader()));
-                } catch (ClassNotFoundException cnfe) {
-                    throw new IllegalStateException("Parameter class could not 
be loaded for type " + paramType, cnfe);
-                }
-            }
-
-            final Class[] parameters = parameterTypes.toArray(new 
Class[parameterTypes.size()]);
-
-            IllegalStateException noSuchMethod = null;
-            while (clazz != null) {
-                try {
-                    return clazz.getDeclaredMethod(name, parameters);
-                } catch (NoSuchMethodException e) {
-                    if (noSuchMethod == null) {
-                        noSuchMethod = new IllegalStateException("Callback 
method does not exist: " + clazz.getName() + "." + name, e);
-                    }
-                    clazz = clazz.getSuperclass();
-                }
-            }
-
-            throw noSuchMethod;
-        }
-
-    }
-
-    public static class FieldInfo extends Annotatable implements Info {
-        private final String name;
-        private final String type;
-        private final ClassInfo declaringClass;
-        private Field field;
-
-        public FieldInfo(ClassInfo info, Field field) {
-            super(field);
-            this.declaringClass = info;
-            this.name = field.getName();
-            this.type = field.getType().getName();
-            this.field = field;
-        }
-
-        public FieldInfo(ClassInfo declaringClass, String name, String type) {
-            this.declaringClass = declaringClass;
-            this.name = name;
-            this.type = type;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public ClassInfo getDeclaringClass() {
-            return declaringClass;
-        }
-
-        public String getType() {
-            return type;
-        }
-
-        public String toString() {
-            return declaringClass + "#" + name;
-        }
-
-        @Override
-        public Annotation[] getDeclaredAnnotations() {
-            super.getDeclaredAnnotations();
-            try {
-                return ((AnnotatedElement) get()).getDeclaredAnnotations();
-            } catch (ClassNotFoundException e) {
-                return super.getDeclaredAnnotations();
-            }
-        }
-
-        public Member get() throws ClassNotFoundException {
-            if (field == null) {
-                field = toField();
-            }
-
-            return field;
-        }
-
-        private Field toField() throws ClassNotFoundException {
-
-            final Class<?> clazz = this.declaringClass.get();
-
-            try {
-                return clazz.getDeclaredField(name);
-            } catch (NoSuchFieldException e) {
-                throw new IllegalStateException(name, e);
-            }
-
-        }
-    }
-
-    public static class AnnotationInfo extends Annotatable implements Info {
-        private final String name;
-
-        public AnnotationInfo(Annotation annotation) {
-            this(annotation.getClass().getName());
-        }
-
-        public AnnotationInfo(Class<? extends Annotation> annotation) {
-            this.name = annotation.getName().intern();
-        }
-
-        public AnnotationInfo(String name) {
-            this.name = name.intern();
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public String toString() {
-            return name;
-        }
-    }
-
     private void index(AnnotationInfo annotationInfo, Info info) {
         initAnnotationInfos(annotationInfo.getName()).add(info);
     }

Added: 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Annotatable.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Annotatable.java?rev=1346714&view=auto
==============================================================================
--- 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Annotatable.java
 (added)
+++ 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Annotatable.java
 Wed Jun  6 02:22:26 2012
@@ -0,0 +1,82 @@
+/*
+ * 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.commons.classscan.finder.model;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class has the following subclasses:
+ *
+ *  PackageInfo
+ *  ClassInfo
+ *  MethodInfo
+ *  FieldInfo
+ *  AnnotationInfo
+ *
+ * The internal Data Model objects.  These could be promoted to top-level 
objects
+ *
+ * A bit of tweaking would be required to make them static before promoting 
them
+ */
+public class Annotatable {
+    private final List<AnnotationInfo> annotations = new 
ArrayList<AnnotationInfo>();
+
+    public Annotatable(AnnotatedElement element) {
+        for (Annotation annotation : getAnnotations(element)) {
+            annotations.add(new 
AnnotationInfo(annotation.annotationType().getName()));
+        }
+    }
+
+    public Annotatable() {
+    }
+
+    public Annotation[] getDeclaredAnnotations() {
+        return new Annotation[0];
+    }
+
+    public List<AnnotationInfo> getAnnotations() {
+        return annotations;
+    }
+
+    /**
+     * Utility method to get around some errors caused by
+     * interactions between the Equinox class loaders and
+     * the OpenJPA transformation process.  There is a window
+     * where the OpenJPA transformation process can cause
+     * an annotation being processed to get defined in a
+     * classloader during the actual defineClass call for
+     * that very class (e.g., recursively).  This results in
+     * a LinkageError exception.  If we see one of these,
+     * retry the request.  Since the annotation will be
+     * defined on the second pass, this should succeed.  If
+     * we get a second exception, then it's likely some
+     * other problem.
+     *
+     * @param element The AnnotatedElement we need information for.
+     * @return An array of the Annotations defined on the element.
+     */
+    private Annotation[] getAnnotations(AnnotatedElement element) {
+        try {
+            return element.getAnnotations();
+        } catch (LinkageError e) {
+            return element.getAnnotations();
+        }
+    }
+
+}

Added: 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/AnnotationInfo.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/AnnotationInfo.java?rev=1346714&view=auto
==============================================================================
--- 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/AnnotationInfo.java
 (added)
+++ 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/AnnotationInfo.java
 Wed Jun  6 02:22:26 2012
@@ -0,0 +1,46 @@
+/*
+ * 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.commons.classscan.finder.model;
+
+import java.lang.annotation.Annotation;
+
+/**
+* @version $Rev$ $Date$
+*/
+public class AnnotationInfo extends Annotatable implements Info {
+    private final String name;
+
+    public AnnotationInfo(Annotation annotation) {
+        this(annotation.getClass().getName());
+    }
+
+    public AnnotationInfo(Class<? extends Annotation> annotation) {
+        this.name = annotation.getName().intern();
+    }
+
+    public AnnotationInfo(String name) {
+        this.name = name.intern();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String toString() {
+        return name;
+    }
+}

Added: 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/ClassInfo.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/ClassInfo.java?rev=1346714&view=auto
==============================================================================
--- 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/ClassInfo.java
 (added)
+++ 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/ClassInfo.java
 Wed Jun  6 02:22:26 2012
@@ -0,0 +1,140 @@
+/*
+ * 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.commons.classscan.finder.model;
+
+import org.apache.commons.classscan.finder.archive.Archive;
+import org.apache.commons.classscan.finder.util.SingleLinkedList;
+
+import java.util.List;
+
+/**
+* @version $Rev$ $Date$
+*/
+public class ClassInfo extends Annotatable implements Info {
+    private String name;
+    private final List<MethodInfo> methods = new 
SingleLinkedList<MethodInfo>();
+    private final List<MethodInfo> constructors = new 
SingleLinkedList<MethodInfo>();
+    private String superType;
+    private ClassInfo superclassInfo;
+    private final List<ClassInfo> subclassInfos = new 
SingleLinkedList<ClassInfo>();
+    private final List<String> interfaces = new SingleLinkedList<String>();
+    private final List<FieldInfo> fields = new SingleLinkedList<FieldInfo>();
+    private Class<?> clazz;
+
+    private Archive archive;
+
+    public ClassInfo(Class clazz) {
+        super(clazz);
+        this.setClazz(clazz);
+        this.setName(clazz.getName());
+
+        final Class superclass = clazz.getSuperclass();
+
+        this.setSuperType(superclass != null ? superclass.getName() : null);
+        for (Class intrface : clazz.getInterfaces()) {
+            this.getInterfaces().add(intrface.getName());
+        }
+    }
+
+    public ClassInfo(Archive archive, String name, String superType) {
+        this.setName(name);
+        this.setSuperType(superType);
+        this.setArchive(archive);
+    }
+
+    public String getPackageName() {
+        return getName().indexOf(".") > 0 ? getName().substring(0, 
getName().lastIndexOf(".")) : "";
+    }
+
+    public List<MethodInfo> getConstructors() {
+        return constructors;
+    }
+
+    public List<String> getInterfaces() {
+        return interfaces;
+    }
+
+    public List<FieldInfo> getFields() {
+        return fields;
+    }
+
+    public List<MethodInfo> getMethods() {
+        return methods;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getSuperType() {
+        return superType;
+    }
+
+    public boolean isAnnotation() {
+        return "java.lang.Object".equals(getSuperType()) && 
getInterfaces().size() == 1 && 
"java.lang.annotation.Annotation".equals(getInterfaces().get(0));
+    }
+
+    public Class<?> get() throws ClassNotFoundException {
+        if (getClazz() != null) return getClazz();
+        final String fixedName = getName().replaceFirst("<.*>", "");
+        this.setClazz(getArchive().loadClass(fixedName));
+        return getClazz();
+    }
+
+    public String toString() {
+        return getName();
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setSuperType(String superType) {
+        this.superType = superType;
+    }
+
+    public ClassInfo getSuperclassInfo() {
+        return superclassInfo;
+    }
+
+    public void setSuperclassInfo(ClassInfo superclassInfo) {
+        this.superclassInfo = superclassInfo;
+    }
+
+    public List<ClassInfo> getSubclassInfos() {
+        return subclassInfos;
+    }
+
+    public Class<?> getClazz() {
+        return clazz;
+    }
+
+    public void setClazz(Class<?> clazz) {
+        this.clazz = clazz;
+    }
+
+    /**
+     * Allows lazy loading of the related java class
+     */
+    public Archive getArchive() {
+        return archive;
+    }
+
+    public void setArchive(Archive archive) {
+        this.archive = archive;
+    }
+}

Added: 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/FieldInfo.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/FieldInfo.java?rev=1346714&view=auto
==============================================================================
--- 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/FieldInfo.java
 (added)
+++ 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/FieldInfo.java
 Wed Jun  6 02:22:26 2012
@@ -0,0 +1,92 @@
+/*
+ * 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.commons.classscan.finder.model;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+
+/**
+* @version $Rev$ $Date$
+*/
+public class FieldInfo extends Annotatable implements Info {
+    private final String name;
+    private final String type;
+    private final ClassInfo declaringClass;
+    private Field field;
+
+    public FieldInfo(ClassInfo info, Field field) {
+        super(field);
+        this.declaringClass = info;
+        this.name = field.getName();
+        this.type = field.getType().getName();
+        this.field = field;
+    }
+
+    public FieldInfo(ClassInfo declaringClass, String name, String type) {
+        this.declaringClass = declaringClass;
+        this.name = name;
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public ClassInfo getDeclaringClass() {
+        return declaringClass;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String toString() {
+        return declaringClass + "#" + name;
+    }
+
+    @Override
+    public Annotation[] getDeclaredAnnotations() {
+        super.getDeclaredAnnotations();
+        try {
+            return ((AnnotatedElement) get()).getDeclaredAnnotations();
+        } catch (ClassNotFoundException e) {
+            return super.getDeclaredAnnotations();
+        }
+    }
+
+    public Member get() throws ClassNotFoundException {
+        if (field == null) {
+            field = toField();
+        }
+
+        return field;
+    }
+
+    private Field toField() throws ClassNotFoundException {
+
+        final Class<?> clazz = this.declaringClass.get();
+
+        try {
+            return clazz.getDeclaredField(name);
+        } catch (NoSuchFieldException e) {
+            throw new IllegalStateException(name, e);
+        }
+
+    }
+}

Added: 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Info.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Info.java?rev=1346714&view=auto
==============================================================================
--- 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Info.java
 (added)
+++ 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/Info.java
 Wed Jun  6 02:22:26 2012
@@ -0,0 +1,32 @@
+/*
+ * 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.commons.classscan.finder.model;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+/**
+* @version $Rev$ $Date$
+*/
+public interface Info {
+
+    String getName();
+
+    List<AnnotationInfo> getAnnotations();
+
+    Annotation[] getDeclaredAnnotations();
+}

Added: 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/MethodInfo.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/MethodInfo.java?rev=1346714&view=auto
==============================================================================
--- 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/MethodInfo.java
 (added)
+++ 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/MethodInfo.java
 Wed Jun  6 02:22:26 2012
@@ -0,0 +1,136 @@
+/*
+ * 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.commons.classscan.finder.model;
+
+import org.apache.commons.classscan.finder.util.Classes;
+import org.apache.commons.classscan.finder.util.SingleLinkedList;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @version $Rev$ $Date$
+*/
+public class MethodInfo extends Annotatable implements Info {
+    private final ClassInfo declaringClass;
+    private final String name;
+    private final List<List<AnnotationInfo>> parameterAnnotations = new 
ArrayList<List<AnnotationInfo>>();
+    private final List<String> parameters = new SingleLinkedList<String>();
+    private Member method;
+
+    public MethodInfo(ClassInfo info, Constructor constructor) {
+        super(constructor);
+        this.declaringClass = info;
+        this.name = "<init>";
+    }
+
+    public MethodInfo(ClassInfo info, Method method) {
+        super(method);
+        this.declaringClass = info;
+        this.name = method.getName();
+        this.method = method;
+    }
+
+    public MethodInfo(ClassInfo declarignClass, String name, List<String> 
params) {
+        this.declaringClass = declarignClass;
+        this.name = name;
+        this.parameters.addAll(params);
+    }
+
+    @Override
+    public Annotation[] getDeclaredAnnotations() {
+        super.getDeclaredAnnotations();
+        try {
+            return ((AnnotatedElement) get()).getDeclaredAnnotations();
+        } catch (ClassNotFoundException e) {
+            return super.getDeclaredAnnotations();
+        }
+    }
+
+    public boolean isConstructor() {
+        return getName().equals("<init>");
+    }
+
+    public List<List<AnnotationInfo>> getParameterAnnotations() {
+        return parameterAnnotations;
+    }
+
+    public List<AnnotationInfo> getParameterAnnotations(int index) {
+        if (index >= parameterAnnotations.size()) {
+            for (int i = parameterAnnotations.size(); i <= index; i++) {
+                final List<AnnotationInfo> annotationInfos = new 
ArrayList<AnnotationInfo>();
+                parameterAnnotations.add(i, annotationInfos);
+            }
+        }
+        return parameterAnnotations.get(index);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public ClassInfo getDeclaringClass() {
+        return declaringClass;
+    }
+
+    public String toString() {
+        return declaringClass + "@" + name;
+    }
+
+    public Member get() throws ClassNotFoundException {
+        if (method == null) {
+            method = toMethod();
+        }
+
+        return method;
+    }
+
+    private Method toMethod() throws ClassNotFoundException {
+        Class<?> clazz = this.declaringClass.get();
+        final List<Class> parameterTypes = new ArrayList<Class>();
+
+        for (String paramType : parameters) {
+            try {
+                parameterTypes.add(Classes.forName(paramType, 
clazz.getClassLoader()));
+            } catch (ClassNotFoundException cnfe) {
+                throw new IllegalStateException("Parameter class could not be 
loaded for type " + paramType, cnfe);
+            }
+        }
+
+        final Class[] parameters = parameterTypes.toArray(new 
Class[parameterTypes.size()]);
+
+        IllegalStateException noSuchMethod = null;
+        while (clazz != null) {
+            try {
+                return clazz.getDeclaredMethod(name, parameters);
+            } catch (NoSuchMethodException e) {
+                if (noSuchMethod == null) {
+                    noSuchMethod = new IllegalStateException("Callback method 
does not exist: " + clazz.getName() + "." + name, e);
+                }
+                clazz = clazz.getSuperclass();
+            }
+        }
+
+        throw noSuchMethod;
+    }
+
+}

Added: 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/PackageInfo.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/PackageInfo.java?rev=1346714&view=auto
==============================================================================
--- 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/PackageInfo.java
 (added)
+++ 
commons/sandbox/classscan/branches/commons-finder/src/main/java/org/apache/commons/classscan/finder/model/PackageInfo.java
 Wed Jun  6 02:22:26 2012
@@ -0,0 +1,66 @@
+/*
+ * 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.commons.classscan.finder.model;
+
+import org.apache.commons.classscan.finder.archive.Archive;
+
+/**
+* @version $Rev$ $Date$
+*/
+public class PackageInfo extends Annotatable implements Info {
+    private final String name;
+    private final ClassInfo info;
+    private final Package pkg;
+
+    public PackageInfo(Package pkg) {
+        super(pkg);
+        this.pkg = pkg;
+        this.name = pkg.getName();
+        this.info = null;
+    }
+
+    public PackageInfo(Archive archive, String name) {
+        info = new ClassInfo(archive, name, null);
+        this.name = name;
+        this.pkg = null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Package get() throws ClassNotFoundException {
+        return (pkg != null) ? pkg : info.get().getPackage();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        final PackageInfo that = (PackageInfo) o;
+
+        if (name != null ? !name.equals(that.name) : that.name != null) return 
false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return name != null ? name.hashCode() : 0;
+    }
+}


Reply via email to