in core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/parser/synthetic/SyntheticAttributeExtension.java [77:181]
public IEventSinkFactory getEventSinkFactory(final IEventSinkFactory sf) {
return SettingsTransformer.wrapSinkFactory(new IEventSinkFactory() {
@Override
public IEventSink create(
String identifier, String label, String[] category, String description,
List<ValueField> dataStructure) {
if (JdkTypeIDs.EXECUTION_SAMPLE.equals(identifier)) {
ValueField[] struct = new ValueField[dataStructure.size()];
for (int i = 0; i < struct.length; i++) {
ValueField vf = dataStructure.get(i);
if (vf.matches(EXECUTION_SAMPLES_STACKTRACE)) {
vf = new ValueField(EVENT_STACKTRACE);
} else if (vf.matches(EXECUTION_SAMPLES_THREAD)) {
vf = new ValueField(EVENT_THREAD);
}
struct[i] = vf;
}
dataStructure = Arrays.asList(struct);
} else if (JdkTypeIDs.NATIVE_METHOD_SAMPLE.equals(identifier)) {
ValueField[] struct = new ValueField[dataStructure.size()];
for (int i = 0; i < struct.length; i++) {
ValueField vf = dataStructure.get(i);
if (vf.matches(EXECUTION_SAMPLES_THREAD)) {
vf = new ValueField(EVENT_THREAD);
}
struct[i] = vf;
}
dataStructure = Arrays.asList(struct);
} else if (JdkTypeIDs.THREAD_ALLOCATION_STATISTICS.equals(identifier)) {
ValueField[] struct = new ValueField[dataStructure.size()];
for (int i = 0; i < struct.length; i++) {
ValueField vf = dataStructure.get(i);
if (vf.matches(ALLOC_STATISTICS_THREAD)) {
vf = new ValueField(EVENT_THREAD);
}
struct[i] = vf;
}
dataStructure = Arrays.asList(struct);
} else if (JdkTypeIDs.EXCEPTIONS_THROWN.equals(identifier)) {
for (int i = 0; i < dataStructure.size(); i++) {
final int stacktraceIndex = i;
if (dataStructure.get(i).matches(JfrAttributes.EVENT_STACKTRACE)) {
final IEventSink subSink = sf.create(identifier, label, category, description,
dataStructure);
return new IEventSink() {
@Override
public void addEvent(Object[] values) {
IMCStackTrace st = (IMCStackTrace) values[stacktraceIndex];
/*
* NOTE: Filters out JavaExceptionThrow events created from the
* Error constructor to avoid constructed errors being
* represented both with a JavaErrorThrow and two
* JavaExceptionThrow.
*/
if (st == null || st.getFrames().size() < 2
|| !isError(st.getFrames().get(0)) && !isError(st.getFrames().get(1))) {
subSink.addEvent(values);
}
}
private boolean isError(IMCFrame frame) {
return frame.getMethod().getType().getFullName().equals("java.lang.Error"); //$NON-NLS-1$
}
};
}
}
} else if (JdkTypeIDs.RECORDING_SETTING.equals(identifier)) {
ValueField[] struct = new ValueField[dataStructure.size()];
for (int i = 0; i < struct.length; i++) {
ValueField vf = dataStructure.get(i);
if (vf.matches(REC_SETTING_EVENT_ID_ATTRIBUTE)) {
vf = new ValueField(JdkAttributes.REC_SETTING_FOR);
}
struct[i] = vf;
}
dataStructure = Arrays.asList(struct);
} else if (JdkTypeIDs.MODULE_EXPORT.equals(identifier)) {
// Unwrapping the exporting module field from the exported package as a separate attribute in the event type.
int packageIndex = -1;
for (int i = 0; i < dataStructure.size(); i++) {
ValueField vf = dataStructure.get(i);
if (vf.matches(JdkAttributes.EXPORTED_PACKAGE)) {
packageIndex = i;
break;
}
}
if (packageIndex != -1) {
List<ValueField> newDataStructure = new ArrayList<>(dataStructure);
newDataStructure.add(new ValueField(JdkAttributes.EXPORTING_MODULE));
IEventSink subSink = sf.create(identifier, label, category, description, newDataStructure);
IEventSink moduleExportSink = new ModuleExportSink(subSink, packageIndex);
return moduleExportSink;
}
}
return sf.create(identifier, label, category, description, dataStructure);
}
@Override
public void flush() {
sf.flush();
}
});
}