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();
}
}
}
Aggregations