private static void transformEachDataType(FileDataTypeManager oldFileArchive,
			FileDataTypeManager newFileArchive, TaskMonitor monitor) throws CancelledException {
		boolean commit = false;
		int transactionID = newFileArchive.startTransaction("Transforming Data Type Archive");
		try {
			// Guarantee that the data type IDs won't already match those in the old archive.
			// This is necessary if we re-run the transformer for an archive.
			assignNewUniversalIDs(newFileArchive, monitor);

			// Perform an initial pass to match by path name if possible and check for
			// anonymous data types that matched by matching components.
			Iterator<DataType> allDataTypes = newFileArchive.getAllDataTypes();
			while (allDataTypes.hasNext()) {
				monitor.checkCancelled();
				DataType newDataType = allDataTypes.next();
				if (isAnonymousType(newDataType)) {
					// Skip anonymous types, they are matched as components of composites or
					// later unmatched enums are matched in categories.
					continue;
				}
				if (newDataType instanceof Pointer || newDataType instanceof Array ||
					newDataType instanceof BuiltIn) {
					continue; // Skip pointer array or builtin.
				}
				DataType oldDataType =
					transformDataType(newDataType, oldFileArchive, newFileArchive);

				// Now process children anonymous data types for composites.
				processAnonymous(oldDataType, newDataType, oldFileArchive, newFileArchive);

//				monitor.incrementProgress(1);
				monitor.setMessage("Transforming ID for " + newDataType.getPathName());
			}

			// Process any unmatched enums by trying to match within each matching category.
			processUnmatchedEnums(oldFileArchive, newFileArchive, monitor);

			commit = true;
		}
		finally {
			newFileArchive.endTransaction(transactionID, commit);
		}
	}
DataTypeArchiveTransformer changes (transforms) a new archive file so that it appears to be
an updated copy of a previously existing data type archive. This allows us to parse a new
version of each standard GDT file we supply. This class changes the IDs on the data types
so they will match the previous version's IDs. This allows the new data type archive and
its data types to become the associated data types where the previous version data types
were applied.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeArchiveTransformer.java