Search in sources :

Example 1 with Parser

use of org.kohsuke.accmod.impl.Restrictions.Parser in project access-modifier by kohsuke.

the class Checker method loadRestrictions.

/**
 * Loads an additional restriction from the specified "META-INF/annotations/org.kohsuke.accmod.Restricted" file.
 *
 * @param isInTheInspectedModule
 *      This value shows up in {@link RestrictedElement#isInTheInspectedModule()}.
 * @param stream
 */
public void loadRestrictions(InputStream stream, final boolean isInTheInspectedModule) throws IOException {
    if (stream == null)
        return;
    BufferedReader r = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
    String className;
    while ((className = r.readLine()) != null) {
        InputStream is = dependencies.getResourceAsStream(className.replace('.', '/') + ".class");
        if (is == null) {
            errorListener.onWarning(null, null, "Failed to find class file for " + className);
            continue;
        }
        try {
            new ClassReader(is).accept(new ClassVisitor(Opcodes.ASM5) {

                private String className;

                @Override
                public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
                    this.className = name;
                }

                @Override
                public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                    return onAnnotationFor(className, desc);
                }

                @Override
                public FieldVisitor visitField(int access, final String name, String desc, String signature, Object value) {
                    return new FieldVisitor(Opcodes.ASM5) {

                        @Override
                        public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                            return onAnnotationFor(className + '.' + name, desc);
                        }
                    };
                }

                @Override
                public MethodVisitor visitMethod(int access, final String methodName, final String methodDesc, String signature, String[] exceptions) {
                    return new MethodVisitor(Opcodes.ASM5) {

                        @Override
                        public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                            return onAnnotationFor(className + '.' + methodName + methodDesc, desc);
                        }
                    };
                }

                /**
                 * Parse {@link Restricted} annotation on some annotated element.
                 */
                private AnnotationVisitor onAnnotationFor(final String keyName, String desc) {
                    if (RESTRICTED_DESCRIPTOR.equals(desc)) {
                        RestrictedElement target = new RestrictedElement() {

                            public boolean isInTheInspectedModule() {
                                return isInTheInspectedModule;
                            }

                            public String toString() {
                                return keyName;
                            }
                        };
                        return new Parser(target) {

                            @Override
                            public void visitEnd() {
                                try {
                                    restrictions.put(keyName, build(factory));
                                } catch (ClassNotFoundException e) {
                                    failure(e);
                                } catch (InstantiationException e) {
                                    failure(e);
                                } catch (IllegalAccessException e) {
                                    failure(e);
                                }
                            }

                            /**
                             * Fails to load a {@link AccessRestriction} instance.
                             */
                            private void failure(Exception e) {
                                errorListener.onError(e, null, "Failed to load restrictions");
                            }
                        };
                    }
                    return null;
                }
            }, ClassReader.SKIP_CODE);
        } finally {
            is.close();
        }
    }
}
Also used : InputStreamReader(java.io.InputStreamReader) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) ClassVisitor(org.objectweb.asm.ClassVisitor) FieldVisitor(org.objectweb.asm.FieldVisitor) IOException(java.io.IOException) MethodVisitor(org.objectweb.asm.MethodVisitor) Parser(org.kohsuke.accmod.impl.Restrictions.Parser) BufferedReader(java.io.BufferedReader) AnnotationVisitor(org.objectweb.asm.AnnotationVisitor) ClassReader(org.objectweb.asm.ClassReader)

Aggregations

BufferedReader (java.io.BufferedReader)1 FileInputStream (java.io.FileInputStream)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 InputStreamReader (java.io.InputStreamReader)1 Parser (org.kohsuke.accmod.impl.Restrictions.Parser)1 AnnotationVisitor (org.objectweb.asm.AnnotationVisitor)1 ClassReader (org.objectweb.asm.ClassReader)1 ClassVisitor (org.objectweb.asm.ClassVisitor)1 FieldVisitor (org.objectweb.asm.FieldVisitor)1 MethodVisitor (org.objectweb.asm.MethodVisitor)1