static IEventSinkFactory wrapSinkFactory()

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