private PropertyMap<?> getPropertyMap(DBRecord rec) throws IOException {
		try {
			PropertyMap<?> map;
			int type = rec.getIntValue(PROPERTY_TYPE_COL);
			switch (type) {
				case PROPERTY_TYPE_STRING:
					map = new StringPropertyMapDB(dbh, OpenMode.UPGRADE, this, changeMgr,
						addressMap, rec.getString(PROPERTY_NAME_COL), TaskMonitor.DUMMY);
					break;
				case PROPERTY_TYPE_LONG:
					map = new LongPropertyMapDB(dbh, OpenMode.UPGRADE, this, changeMgr, addressMap,
						rec.getString(PROPERTY_NAME_COL), TaskMonitor.DUMMY);
					break;
				case PROPERTY_TYPE_INT:
					map = new IntPropertyMapDB(dbh, OpenMode.UPGRADE, this, changeMgr, addressMap,
						rec.getString(PROPERTY_NAME_COL), TaskMonitor.DUMMY);
					break;
				case PROPERTY_TYPE_BOOLEAN:
					map = new VoidPropertyMapDB(dbh, OpenMode.UPGRADE, this, changeMgr, addressMap,
						rec.getString(PROPERTY_NAME_COL), TaskMonitor.DUMMY);
					break;
				case PROPERTY_TYPE_SAVEABLE:
					String className = rec.getString(PROPERTY_CLASS_COL);
					Class<? extends Saveable> c =
						ObjectPropertyMapDB.getSaveableClassForName(className);
					return new ObjectPropertyMapDB<>(dbh, OpenMode.UPGRADE, this, changeMgr,
						addressMap, rec.getString(PROPERTY_NAME_COL), c, TaskMonitor.DUMMY, true);
				default:
					throw new IllegalArgumentException("Unsupported property type: " + type);
			}
			propertyMaps.put(rec.getKey(), map);
			return map;
		}
		catch (CancelledException e) {
			throw new AssertException("Unexpected Error", e);
		}
		catch (VersionException e) {
			throw new IOException("Incompatable property data for '" +
				rec.getString(PROPERTY_NAME_COL) + "': " + e.getMessage());
		}
	}
Translate language
@param translator language translator, if null only re-disassembly will occur.
@param monitor task monitor
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/ProgramUserDataDB.java