in core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/parser/synthetic/SettingsTransformer.java [274:348]
static IEventSinkFactory wrapSinkFactory(final IEventSinkFactory subFactory) {
return new IEventSinkFactory() {
@Override
public IEventSink create(
String identifier, String label, String[] category, String description,
List<ValueField> dataStructure) {
if (JdkTypeIDsPreJdk11.RECORDING_SETTING.equals(identifier) ||
JdkTypeIDsPreJdk11.JDK9_RECORDING_SETTING.equals(identifier)) {
SettingsTransformer st = new SettingsTransformer(subFactory, label, category, description,
dataStructure);
if ((JdkTypeIDsPreJdk11.RECORDING_SETTING.equals(identifier) &&
st.isValid()) ||
(JdkTypeIDsPreJdk11.JDK9_RECORDING_SETTING.equals(identifier) &&
st.isValidV1())) {
return st;
} else {
// FIXME: Avoid System.err.println
System.err
.println("Cannot create SettingsTransformer from fields: " + dataStructure.toString()); //$NON-NLS-1$
}
} else if (JdkTypeIDsPreJdk11.RECORDINGS.equals(identifier)) {
/*
* NOTE: Renaming 'duration' and 'startTime' attributes for JDK 8 'Recording'
* events so that they won't conflict with general attributes with the same
* names in JDK 9+ recordings.
*/
ValueField[] struct = new ValueField[dataStructure.size()];
for (int i = 0; i < struct.length; i++) {
ValueField vf = dataStructure.get(i);
if (vf.matches(JfrAttributes.START_TIME)) {
vf = new ValueField(JdkAttributes.RECORDING_START);
} else if (vf.matches(JfrAttributes.DURATION)) {
vf = new ValueField(JdkAttributes.RECORDING_DURATION);
}
struct[i] = vf;
}
return subFactory.create(JdkTypeIDs.RECORDINGS, label, category, description,
Arrays.asList(struct));
} else if (JdkTypeIDsPreJdk11.CODE_CACHE_STATISTICS.equals(identifier)) {
for (int i = 0; i < dataStructure.size(); i++) {
if (UNALLOCATED_CAPACITY_FIELD_ID.equals(dataStructure.get(i).getIdentifier())) {
return new FixCodeCacheSink(i, subFactory.create(JdkTypeIDsPreJdk11.translate(identifier),
label, category, description, dataStructure));
}
}
}
return subFactory.create(JdkTypeIDsPreJdk11.translate(identifier), label, category, description,
translate(identifier, dataStructure));
}
private List<ValueField> translate(String identifier, List<ValueField> dataStructure) {
Map<String, String> attrMap = attributeRenameMap.get(identifier);
if (attrMap == null) {
return dataStructure;
}
List<ValueField> renamedDataStructure = new ArrayList<>();
for (ValueField vf : dataStructure) {
String renamedId = attrMap.get(vf.getIdentifier());
if (renamedId == null) {
renamedDataStructure.add(vf);
} else {
renamedDataStructure
.add(new ValueField(renamedId, vf.getName(), vf.getDescription(), vf.getContentType()));
}
}
return renamedDataStructure;
}
@Override
public void flush() {
subFactory.flush();
}
};
}