/** * @param nameMapper Name mapper. * @param idMapper ID mapper. * @return Mapper. */ private static BinaryInternalMapper resolveMapper(BinaryNameMapper nameMapper, BinaryIdMapper idMapper) { if ((nameMapper == null || (DFLT_MAPPER.nameMapper().equals(nameMapper))) && (idMapper == null || DFLT_MAPPER.idMapper().equals(idMapper))) return DFLT_MAPPER; if (nameMapper != null && nameMapper instanceof BinaryBasicNameMapper && ((BinaryBasicNameMapper)nameMapper).isSimpleName() && idMapper != null && idMapper instanceof BinaryBasicIdMapper && ((BinaryBasicIdMapper)idMapper).isLowerCase()) return SIMPLE_NAME_LOWER_CASE_MAPPER; if (nameMapper == null) nameMapper = DFLT_MAPPER.nameMapper(); if (idMapper == null) idMapper = DFLT_MAPPER.idMapper(); return new BinaryInternalMapper(nameMapper, idMapper, true); }
/** * @param typeName Type name. * @return Type ID. */ public int typeId(String typeName) { Integer id = predefinedTypeNames.get(SIMPLE_NAME_LOWER_CASE_MAPPER.typeName(typeName)); if (id != null) return id; if (marshCtx.isSystemType(typeName)) return typeName.hashCode(); BinaryInternalMapper mapper = userTypeMapper(typeName); return mapper.typeId(typeName); }
/** * @param clsName Type name. * @return Instance of ID mapper. */ BinaryInternalMapper userTypeMapper(String clsName) { BinaryInternalMapper mapper = cls2Mappers.get(clsName); if (mapper != null) return mapper; mapper = resolveMapper(clsName, igniteCfg.getBinaryConfiguration()); BinaryInternalMapper prevMap = cls2Mappers.putIfAbsent(clsName, mapper); if (prevMap != null && !mapper.equals(prevMap)) throw new IgniteException("Different mappers [clsName=" + clsName + ", newMapper=" + mapper + ", prevMap=" + prevMap + "]"); prevMap = typeId2Mapper.putIfAbsent(mapper.typeId(clsName), mapper); if (prevMap != null && !mapper.equals(prevMap)) throw new IgniteException("Different mappers [clsName=" + clsName + ", newMapper=" + mapper + ", prevMap=" + prevMap + "]"); return mapper; }
/** * @throws Exception If failed. */ @Test public void testTypeConfigurationsWithNonGlobalMapperJar() throws Exception { BinaryMarshaller marsh = binaryMarshaller(new BinaryBasicNameMapper(false), new BinaryIdMapper() { @Override public int typeId(String clsName) { if (clsName.endsWith("1")) return 300; else if (clsName.endsWith("2")) return 400; else return -500; } @Override public int fieldId(int typeId, String fieldName) { return 0; } }, Arrays.asList( new BinaryTypeConfiguration("org.apache.ignite.internal.binary.test.*"), new BinaryTypeConfiguration("unknown.*") )); BinaryContext ctx = binaryContext(marsh); Map<String, org.apache.ignite.internal.binary.BinaryInternalMapper> typeMappers = U.field(ctx, "cls2Mappers"); assertEquals(3, typeMappers.size()); assertFalse(((BinaryBasicNameMapper)typeMappers.get(CLASS1_FULL_NAME).nameMapper()).isSimpleName()); assertEquals(300, typeMappers.get(CLASS1_FULL_NAME).idMapper().typeId(CLASS1_FULL_NAME)); assertFalse(((BinaryBasicNameMapper)typeMappers.get(CLASS2_FULL_NAME).nameMapper()).isSimpleName()); assertEquals(400, typeMappers.get(CLASS2_FULL_NAME).idMapper().typeId(CLASS2_FULL_NAME)); }
/** * @return ID mapper used as default. */ public static BinaryIdMapper defaultIdMapper() { return DFLT_MAPPER.idMapper(); }
/** * @param clsName Class name. * @return Type name. */ public String userTypeName(String clsName) { BinaryInternalMapper mapper = userTypeMapper(clsName); return mapper.typeName(clsName); }
/** * @param name Field name. * @return Field offset. */ private int fieldId(String name) { assert name != null; return mapper.fieldId(typeId, name); }
/** * @return Name mapper used as default. */ public static BinaryNameMapper defaultNameMapper() { return DFLT_MAPPER.nameMapper(); }
/** * @param clsName Class name. * @return Type ID. */ public int typeId(String clsName) { int id = idMapper.typeId(nameMapper.typeName(clsName)); if (!checkOnZeroId) return id; return id != 0 ? id : BinaryContext.SIMPLE_NAME_LOWER_CASE_MAPPER.typeId(clsName); }
/** * @throws Exception If failed. */ @Test public void testClassNamesWithCustomMapperJar() throws Exception { BinaryMarshaller marsh = binaryMarshaller(new BinaryBasicNameMapper(false), new BinaryIdMapper() { @Override public int typeId(String clsName) { if (clsName.endsWith("1")) return 300; else if (clsName.endsWith("2")) return 400; else return -500; } @Override public int fieldId(int typeId, String fieldName) { return 0; } }, Arrays.asList( new BinaryTypeConfiguration("org.apache.ignite.internal.binary.test.*"), new BinaryTypeConfiguration("unknown.*") )); BinaryContext ctx = binaryContext(marsh); Map<String, org.apache.ignite.internal.binary.BinaryInternalMapper> typeMappers = U.field(ctx, "cls2Mappers"); assertEquals(3, typeMappers.size()); assertFalse(((BinaryBasicNameMapper)typeMappers.get(CLASS1_FULL_NAME).nameMapper()).isSimpleName()); assertEquals(300, typeMappers.get(CLASS1_FULL_NAME).idMapper().typeId(CLASS1_FULL_NAME)); assertFalse(((BinaryBasicNameMapper)typeMappers.get(CLASS2_FULL_NAME).nameMapper()).isSimpleName()); assertEquals(400, typeMappers.get(CLASS2_FULL_NAME).idMapper().typeId(CLASS2_FULL_NAME)); }
/** * @throws Exception If failed. */ @Test public void testClassNamesCustomMappers() throws Exception { BinaryMarshaller marsh = binaryMarshaller(null, new BinaryIdMapper() { @Override public int typeId(String clsName) { if (clsName.endsWith("1")) return 300; else if (clsName.endsWith("2")) return 400; else if (clsName.endsWith("InnerClass")) return 500; else return -500; } @Override public int fieldId(int typeId, String fieldName) { return 0; } }, Arrays.asList( new BinaryTypeConfiguration("org.apache.ignite.internal.binary.test.*"), new BinaryTypeConfiguration("unknown.*") )); BinaryContext ctx = binaryContext(marsh); Map<String, org.apache.ignite.internal.binary.BinaryInternalMapper> typeMappers = U.field(ctx, "cls2Mappers"); assertEquals(3, typeMappers.size()); assertEquals(300, typeMappers.get(CLASS1_FULL_NAME).idMapper().typeId(CLASS1_FULL_NAME)); assertEquals(400, typeMappers.get(CLASS2_FULL_NAME).idMapper().typeId(CLASS2_FULL_NAME)); assertEquals(500, typeMappers.get(INNER_CLASS_FULL_NAME).idMapper().typeId(INNER_CLASS_FULL_NAME)); }
@Override public int typeId(String clsName) { String typeName = BinaryContext.SIMPLE_NAME_LOWER_CASE_MAPPER.typeName(clsName); return typeName.toLowerCase().hashCode(); }
/** * @param typeId Type ID. * @param fieldName Field name. * @return Field ID. */ public int fieldId(int typeId, String fieldName) { BinaryInternalMapper mapper = userTypeMapper(typeId); return mapper.fieldId(typeId, fieldName); }
/** * * @param nameMapper Name mapper. * @param mapper Mapper. * @throws IgniteCheckedException If failed. */ private void checkOverrideNameMapper(BinaryNameMapper nameMapper, BinaryIdMapper mapper) throws IgniteCheckedException { BinaryTypeConfiguration typeCfg = new BinaryTypeConfiguration(); typeCfg.setTypeName(CLASS2_FULL_NAME); typeCfg.setNameMapper(new BinaryNameMapper() { @Override public String typeName(String clsName) { return "type2"; } @Override public String fieldName(String fieldName) { return "field2"; } }); BinaryMarshaller marsh = binaryMarshaller(nameMapper, mapper, Arrays.asList( new BinaryTypeConfiguration("org.apache.ignite.internal.binary.test.*"), typeCfg)); BinaryContext ctx = binaryContext(marsh); ConcurrentMap<Integer, BinaryInternalMapper> types = U.field(ctx, "typeId2Mapper"); assertEquals(3, types.size()); assertTrue(types.containsKey(typeId(CLASS1_FULL_NAME, nameMapper, mapper))); assertTrue(types.containsKey(typeId(INNER_CLASS_FULL_NAME, nameMapper, mapper))); assertTrue(types.containsKey("type2".hashCode())); Map<String, org.apache.ignite.internal.binary.BinaryInternalMapper> typeMappers = U.field(ctx, "cls2Mappers"); assertEquals("type2", typeMappers.get(CLASS2_FULL_NAME).nameMapper().typeName(CLASS2_FULL_NAME)); }
String typeName = entry.getKey(); int typeId = globalMapper.typeId(typeName);
/** * @param cls Class. * @param id Type ID. * @param affFieldName Affinity field name. * @return GridBinaryClassDescriptor. */ public BinaryClassDescriptor registerPredefinedType(Class<?> cls, int id, String affFieldName, boolean registered) { String simpleClsName = SIMPLE_NAME_LOWER_CASE_MAPPER.typeName(cls.getName()); if (id == 0) id = SIMPLE_NAME_LOWER_CASE_MAPPER.typeId(simpleClsName); BinaryClassDescriptor desc = new BinaryClassDescriptor( this, cls, false, id, simpleClsName, affFieldName, SIMPLE_NAME_LOWER_CASE_MAPPER, new BinaryReflectiveSerializer(), false, registered /* registered */ ); predefinedTypeNames.put(simpleClsName, id); predefinedTypes.put(id, desc); descByCls.put(cls, desc); if (affFieldName != null) affKeyFieldNames.putIfAbsent(id, affFieldName); return desc; }
/** * @throws Exception If failed. */ @Test public void testTypeConfigurationsWithGlobalMapperJar() throws Exception { BinaryMarshaller marsh = binaryMarshaller(new BinaryBasicNameMapper(false), new BinaryIdMapper() { @Override public int typeId(String clsName) { if (clsName.endsWith("1")) return 300; else if (clsName.endsWith("2")) return 400; else return -500; } @Override public int fieldId(int typeId, String fieldName) { return 0; } }, Arrays.asList( new BinaryTypeConfiguration("org.apache.ignite.internal.binary.test.*"), new BinaryTypeConfiguration("unknown.*") )); BinaryContext ctx = binaryContext(marsh); Map<String, org.apache.ignite.internal.binary.BinaryInternalMapper> typeMappers = U.field(ctx, "cls2Mappers"); assertEquals(3, typeMappers.size()); assertFalse(((BinaryBasicNameMapper)typeMappers.get(CLASS1_FULL_NAME).nameMapper()).isSimpleName()); assertEquals(300, typeMappers.get(CLASS1_FULL_NAME).idMapper().typeId(CLASS1_FULL_NAME)); assertFalse(((BinaryBasicNameMapper)typeMappers.get(CLASS2_FULL_NAME).nameMapper()).isSimpleName()); assertEquals(400, typeMappers.get(CLASS2_FULL_NAME).idMapper().typeId(CLASS2_FULL_NAME)); }
/** * @param nameMapper Name mapper. * @param idMapper ID mapper. * @return Mapper. */ private static BinaryInternalMapper resolveMapper(BinaryNameMapper nameMapper, BinaryIdMapper idMapper) { if ((nameMapper == null || (DFLT_MAPPER.nameMapper().equals(nameMapper))) && (idMapper == null || DFLT_MAPPER.idMapper().equals(idMapper))) return DFLT_MAPPER; if (nameMapper != null && nameMapper instanceof BinaryBasicNameMapper && ((BinaryBasicNameMapper)nameMapper).isSimpleName() && idMapper != null && idMapper instanceof BinaryBasicIdMapper && ((BinaryBasicIdMapper)idMapper).isLowerCase()) return SIMPLE_NAME_LOWER_CASE_MAPPER; if (nameMapper == null) nameMapper = DFLT_MAPPER.nameMapper(); if (idMapper == null) idMapper = DFLT_MAPPER.idMapper(); return new BinaryInternalMapper(nameMapper, idMapper, true); }
/** * @throws Exception If failed. */ @Test public void testTypeConfigurationsWithNonGlobalMapper() throws Exception { BinaryMarshaller marsh = binaryMarshaller(new BinaryBasicNameMapper(true), new BinaryIdMapper() { @Override public int typeId(String clsName) { if (clsName.endsWith("1")) return 300; else if (clsName.endsWith("2")) return 400; else if (clsName.endsWith("InnerClass")) return 500; else return -500; } @Override public int fieldId(int typeId, String fieldName) { return 0; } }, Arrays.asList( new BinaryTypeConfiguration("org.apache.ignite.internal.binary.test.*"), new BinaryTypeConfiguration("unknown.*") )); BinaryContext ctx = binaryContext(marsh); Map<String, org.apache.ignite.internal.binary.BinaryInternalMapper> typeMappers = U.field(ctx, "cls2Mappers"); assertEquals(3, typeMappers.size()); assertEquals(300, typeMappers.get(CLASS1_FULL_NAME).idMapper().typeId(CLASS1_FULL_NAME)); assertEquals(400, typeMappers.get(CLASS2_FULL_NAME).idMapper().typeId(CLASS2_FULL_NAME)); assertEquals(500, typeMappers.get(INNER_CLASS_FULL_NAME).idMapper().typeId(INNER_CLASS_FULL_NAME)); }
/** * Register "type ID to class name" mapping on all nodes to allow for mapping requests resolution form client. * Other {@link BinaryContext}'s "register" methods and method * {@link BinaryContext#descriptorForClass(Class, boolean, boolean)} already call this functionality * so use this method only when registering class names whose {@link Class} is unknown. * * @param typeId Type ID. * @param clsName Class Name. * @return {@code True} if the mapping was registered successfully. */ public boolean registerUserClassName(int typeId, String clsName) { IgniteCheckedException e = null; boolean res = false; try { res = marshCtx.registerClassName(JAVA_ID, typeId, clsName); } catch (DuplicateTypeIdException dupEx) { // Ignore if trying to register mapped type name of the already registered class name and vise versa BinaryInternalMapper mapper = userTypeMapper(typeId); String oldName = dupEx.getRegisteredClassName(); if (!(mapper.typeName(oldName).equals(clsName) || mapper.typeName(clsName).equals(oldName))) e = dupEx; } catch (IgniteCheckedException igniteEx) { e = igniteEx; } if (e != null) throw new BinaryObjectException("Failed to register class.", e); return res; }