mirror of https://github.com/apache/openjpa.git
OPENJPA-385. Committing changes for both 1.0.x and 1.1.0 to properly skip and optionally log malformed .class files.
git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@580087 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
12840cafbf
commit
6f43ce7d40
|
@ -20,6 +20,9 @@ package org.apache.openjpa.lib.meta;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.openjpa.lib.log.Log;
|
||||||
|
import org.apache.openjpa.lib.util.Localizer;
|
||||||
|
|
||||||
import serp.bytecode.lowlevel.ConstantPoolTable;
|
import serp.bytecode.lowlevel.ConstantPoolTable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,6 +36,10 @@ import serp.bytecode.lowlevel.ConstantPoolTable;
|
||||||
public class ClassAnnotationMetaDataFilter implements MetaDataFilter {
|
public class ClassAnnotationMetaDataFilter implements MetaDataFilter {
|
||||||
|
|
||||||
private final String[] _annos;
|
private final String[] _annos;
|
||||||
|
|
||||||
|
private static final Localizer _loc = Localizer.forPackage
|
||||||
|
(ClassAnnotationMetaDataFilter.class);
|
||||||
|
private Log _log = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor; supply annotation to match against.
|
* Constructor; supply annotation to match against.
|
||||||
|
@ -86,9 +93,16 @@ public class ClassAnnotationMetaDataFilter implements MetaDataFilter {
|
||||||
idx += 4 + table.readInt(idx);
|
idx += 4 + table.readInt(idx);
|
||||||
}
|
}
|
||||||
} catch (ArrayIndexOutOfBoundsException e) {
|
} catch (ArrayIndexOutOfBoundsException e) {
|
||||||
|
/*
|
||||||
|
* This ArrayIndexOutOfBoundsException indicates an incorrectly
|
||||||
|
* formed .class file. We will eat the exception, log a trace
|
||||||
|
* message (if a log exists), and return "false" to indicate there
|
||||||
|
* was no match.
|
||||||
|
*/
|
||||||
Error cfe = new ClassFormatError(rsrc.getName());
|
Error cfe = new ClassFormatError(rsrc.getName());
|
||||||
cfe.initCause(e);
|
cfe.initCause(e);
|
||||||
throw cfe;
|
if (_log != null && _log.isTraceEnabled())
|
||||||
|
_log.trace(_loc.get("class-arg", rsrc.getName()), cfe);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -184,4 +198,12 @@ public class ClassAnnotationMetaDataFilter implements MetaDataFilter {
|
||||||
}
|
}
|
||||||
return skipped;
|
return skipped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Log getLog() {
|
||||||
|
return _log;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLog(Log _log) {
|
||||||
|
this._log = _log;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -374,8 +374,11 @@ public class PersistenceMetaDataFactory
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected MetaDataFilter newMetaDataFilter() {
|
protected MetaDataFilter newMetaDataFilter() {
|
||||||
return new ClassAnnotationMetaDataFilter(new Class[]{
|
ClassAnnotationMetaDataFilter camdf = new ClassAnnotationMetaDataFilter(
|
||||||
Entity.class, Embeddable.class, MappedSuperclass.class });
|
new Class[] { Entity.class, Embeddable.class,
|
||||||
|
MappedSuperclass.class });
|
||||||
|
camdf.setLog(log);
|
||||||
|
return camdf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue