private void loadPropertyMaps(OpenMode openMode, TaskMonitor monitor)
			throws VersionException, CancelledException {
		try {
			VersionException ve = null;
			Set<String> oldMapNames = new HashSet<>(propertyMapCache.keySet());
			RecordIterator iter = propertiesDBAdapter.getRecords();
			while (iter.hasNext()) {
				DBRecord rec = iter.next();
				byte propertyType = rec.getByteValue(PROPERTY_TYPE_COL);
				String name = rec.getKeyField().getString();
				oldMapNames.remove(name);

				// Check for pre-existing map
				PropertyMapDB<?> pm = propertyMapCache.get(name);
				if (pm != null) {
					if (pm.validate(lock)) {
						continue; // keep the map we already have
					}
					propertyMapCache.remove(name);
				}

				try {
					switch (propertyType) {
						case INT_PROPERTY_TYPE:
							pm = new IntPropertyMapDB(dbHandle, openMode, program, changeMgr,
								addrMap, name, monitor);
							break;
						case LONG_PROPERTY_TYPE:
							pm = new LongPropertyMapDB(dbHandle, openMode, program, changeMgr,
								addrMap, name, monitor);
							break;
						case STRING_PROPERTY_TYPE:
							pm = new StringPropertyMapDB(dbHandle, openMode, program, changeMgr,
								addrMap, name, monitor);
							break;
						case VOID_PROPERTY_TYPE:
							pm = new VoidPropertyMapDB(dbHandle, openMode, program, changeMgr,
								addrMap, name, monitor);
							break;
						case OBJECT_PROPERTY_TYPE:
							String className = rec.getString(OBJECT_CLASS_COL);
							//boolean upgrade = (openMode == ProgramDB.UPGRADE);
							if (BookmarkManager.OLD_BOOKMARK_PROPERTY_OBJECT_CLASS1
									.equals(className) ||
								BookmarkManager.OLD_BOOKMARK_PROPERTY_OBJECT_CLASS2
										.equals(className)) {
								// Upgrade handled by new BookmarkManager
								if (openMode == OpenMode.UPDATE) {
									throw new VersionException(VersionException.OLDER_VERSION,
										true);
								}
								pm = new ObjectPropertyMapDB<>(dbHandle, openMode, program,
									changeMgr, addrMap, name, OldBookmark.class, monitor, false);
							}
							else {
								pm = new ObjectPropertyMapDB<>(dbHandle, openMode, program,
									changeMgr, addrMap, name,
									ObjectPropertyMapDB.getSaveableClassForName(className), monitor,
									false);
							}

							break;
						default:
							if (openMode != null) {
								// employ unsupported property class
								Msg.showError(this, null, "Unsupported Property", "WARNING: " +
									" property ignored, unrecognized type: " + propertyType);
							}
					}
				}
				catch (VersionException e) {
					ve = e.combine(ve);
				}
				if (pm == null) {
					pm = new UnsupportedMapDB(dbHandle, openMode, program, changeMgr, addrMap, name,
						monitor);
				}
				propertyMapCache.put(name, pm);
			}

			// Remove obsolete maps from cache
			for (String obsoleteMapName : oldMapNames) {
				propertyMapCache.remove(obsoleteMapName);
			}

			if (ve != null) {
				throw ve;
			}
		}
		catch (IOException e) {
			program.dbError(e);
		}
	}
Load {@code propertyMapCache} with all property map instances.
@param openMode open mode or null if in response to a cache invalidate
@param monitor task monitor
@throws VersionException if a version error occurs
@throws CancelledException if task is cancelled
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/properties/DBPropertyMapManager.java