001    package net.sourceforge.retroweaver.runtime.java.lang;
002    
003    import java.lang.annotation.Annotation;
004    
005    /**
006     * A mirror of java.lang.Package
007     * 
008     * @author Toby Reyelts Date: Feb 20, 2005 Time: 11:50:47 PM
009     */
010    public class Package_ {
011    
012            private Package_() {
013                    // private constructor
014            }
015    
016            /**
017             * Implementation notes:
018             * ---------------------
019             * <p/>
020             * Package annotations are a little different from other annotations. The java compiler writes
021             * them into a synthetic interface named, <package-name>.package-info. Here, we implicitly load that
022             * class and pass it onto Class_ when asked for annotation information on a package.
023             * <p/>
024             *
025             */
026            private static Class getPackageAnnotationClass(final Package p) {
027                    try {
028                            return Class.forName(p.getName() + ".package-info");
029                    } catch (ClassNotFoundException e) {
030                            return null;
031                    }
032            }
033    
034            // Provide AnnotatedElement methods
035    
036            // Returns this element's annotation for the specified type if such an
037            // annotation is present, else null.
038            public static <T extends Annotation> T getAnnotation(final Package p, final Class<T> annotationType) {
039                    final Class c = getPackageAnnotationClass(p);
040                    if (c == null) {
041                            return null;
042                    } else {
043                            return (T) c.getAnnotation(annotationType);
044                    }
045            }
046    
047            private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[] {};
048    
049            // Returns all annotations present on this element.
050            public static Annotation[] getAnnotations(final Package p) {
051                    final Class c = getPackageAnnotationClass(p);
052                    if (c == null) {
053                            return EMPTY_ANNOTATION_ARRAY; // NOPMD by xlv
054                    } else {
055                            return c.getAnnotations();
056                    }
057            }
058    
059            // Returns all annotations that are directly present on this element.
060            public static Annotation[] getDeclaredAnnotations(final Package p) {
061                    final Class c = getPackageAnnotationClass(p);
062                    if (c == null) {
063                            return EMPTY_ANNOTATION_ARRAY; // NOPMD by xlv
064                    } else {
065                            return c.getDeclaredAnnotations();
066                    }
067            }
068    
069            // Returns true if an annotation for the specified type is present on this
070            // element, else false.
071            public static boolean isAnnotationPresent(final Package p, final Class<? extends Annotation> annotationType) {
072                    final Class c = getPackageAnnotationClass(p);
073                    if (c == null) {
074                            return false;
075                    } else {
076                            return c.isAnnotationPresent(annotationType);
077                    }
078            }
079    
080    }