public IEventSinkFactory getEventSinkFactory()

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