/** * @param cls Class. * @param id Type ID. * @return GridBinaryClassDescriptor. */ public BinaryClassDescriptor registerPredefinedType(Class<?> cls, int id, String affFieldName) { String typeName = typeName(cls.getName()); if (id == 0) id = BinaryInternalIdMapper.defaultInstance().typeId(typeName); BinaryClassDescriptor desc = new BinaryClassDescriptor( this, cls, false, id, typeName, affFieldName, BinaryInternalIdMapper.defaultInstance(), new BinaryReflectiveSerializer(), false, true /* registered */); predefinedTypeNames.put(typeName, id); predefinedTypes.put(id, desc); descByCls.put(cls, desc); if (affFieldName != null) affKeyFieldNames.putIfAbsent(id, affFieldName); return desc; }
/** * @param globalIdMapper ID mapper. * @param globalSerializer Serializer. * @param typeCfgs Type configurations. * @throws BinaryObjectException In case of error. */ private void configure( BinaryIdMapper globalIdMapper, BinarySerializer globalSerializer, Collection<BinaryTypeConfiguration> typeCfgs) throws BinaryObjectException { TypeDescriptors descs = new TypeDescriptors(); Map<String, String> affFields = new HashMap<>(); if (!F.isEmpty(igniteCfg.getCacheKeyConfiguration())) { for (CacheKeyConfiguration keyCfg : igniteCfg.getCacheKeyConfiguration()) affFields.put(keyCfg.getTypeName(), keyCfg.getAffinityKeyFieldName()); } if (typeCfgs != null) { for (BinaryTypeConfiguration typeCfg : typeCfgs) { String clsName = typeCfg.getTypeName(); if (clsName == null) throw new BinaryObjectException("Class name is required for binary type configuration."); BinaryIdMapper idMapper = globalIdMapper; if (typeCfg.getIdMapper() != null) idMapper = typeCfg.getIdMapper(); idMapper = BinaryInternalIdMapper.create(idMapper); BinarySerializer serializer = globalSerializer; if (typeCfg.getSerializer() != null) serializer = typeCfg.getSerializer(); if (clsName.endsWith(".*")) { String pkgName = clsName.substring(0, clsName.length() - 2); for (String clsName0 : classesInPackage(pkgName)) descs.add( clsName0, idMapper, serializer, affFields.get(clsName0), typeCfg.isEnum(), true); } else descs.add(clsName, idMapper, serializer, affFields.get(clsName), typeCfg.isEnum(), false); } } for (TypeDescriptor desc : descs.descriptors()) registerUserType( desc.clsName, desc.idMapper, desc.serializer, desc.affKeyFieldName, desc.isEnum); BinaryInternalIdMapper dfltMapper = BinaryInternalIdMapper.create(globalIdMapper); // Put affinity field names for unconfigured types. for (Map.Entry<String, String> entry : affFields.entrySet()) { String typeName = entry.getKey(); int typeId = dfltMapper.typeId(typeName); affKeyFieldNames.putIfAbsent(typeId, entry.getValue()); } addSystemClassAffinityKey(CollocatedSetItemKey.class); addSystemClassAffinityKey(CollocatedQueueItemKey.class); }
/** * Creates and registers {@link BinaryClassDescriptor} for the given {@code class}. * * @param cls Class. * @return Class descriptor. */ private BinaryClassDescriptor registerClassDescriptor(Class<?> cls, boolean deserialize) { BinaryClassDescriptor desc; String clsName = cls.getName(); if (marshCtx.isSystemType(clsName)) { desc = new BinaryClassDescriptor( this, cls, false, clsName.hashCode(), clsName, null, BinaryInternalIdMapper.defaultInstance(), null, false, true /* registered */); BinaryClassDescriptor old = descByCls.putIfAbsent(cls, desc); if (old != null) desc = old; } else desc = registerUserClassDescriptor(cls, deserialize); return desc; }
/** * @param typeName Type name. * @return Instance of ID mapper. */ private BinaryIdMapper userTypeIdMapper(String typeName) { BinaryIdMapper idMapper = typeMappers.get(typeName); return idMapper != null ? idMapper : BinaryInternalIdMapper.defaultInstance(); }
/** * @param typeId Type ID. * @return Instance of ID mapper. */ public BinaryIdMapper userTypeIdMapper(int typeId) { BinaryIdMapper idMapper = mappers.get(typeId); return idMapper != null ? idMapper : BinaryInternalIdMapper.defaultInstance(); }