@Override public void fromClass(Class<?> clazz, MessageProperties properties) { properties.getHeaders().put(getClassIdFieldName(), fromClass(clazz)); }
@Override public Class<?> toClass(MessageProperties properties) { Map<String, Object> headers = properties.getHeaders(); Object classIdFieldNameValue = headers.get(getClassIdFieldName()); String classId = null; if (classIdFieldNameValue != null) { classId = classIdFieldNameValue.toString(); } if (classId == null) { if (this.defaultType != null) { return this.defaultType; } else { throw new MessageConversionException( "failed to convert Message content. Could not resolve " + getClassIdFieldName() + " in header " + "and no defaultType provided"); } } return toClass(classId); }
@Test public void fromClassShouldPopulateWithClassNameByDefault() { classMapper.fromClass(SimpleTrade.class, props); String className = (String) props.getHeaders().get( classMapper.getClassIdFieldName()); assertThat(className, equalTo(SimpleTrade.class.getName())); }
@Test public void shouldConvertAnyMapToUseHashtables() { classMapper.fromClass(LinkedHashMap.class, props); String className = (String) props.getHeaders().get( classMapper.getClassIdFieldName()); assertThat(className, equalTo("Hashtable")); }
@Test public void shouldThrowAnExceptionWhenClassIdNotPresent() { try { classMapper.toClass(props); } catch (MessageConversionException e) { String classIdFieldName = classMapper.getClassIdFieldName(); assertThat(e.getMessage(), containsString("Could not resolve " + classIdFieldName + " in header")); } }
@SuppressWarnings("unchecked") @Test public void shouldLookInTheClassIdFieldNameToFindTheClassName() { props.getHeaders().put("type", "java.lang.String"); given(classMapper.getClassIdFieldName()).willReturn("type"); Class<String> clazz = (Class<String>) classMapper.toClass(props); assertThat(clazz, equalTo(String.class)); }
@Test public void shouldUseSpecialNameForClassIfPresent() throws Exception { classMapper.setIdClassMapping(map("daytrade", SimpleTrade.class)); classMapper.afterPropertiesSet(); classMapper.fromClass(SimpleTrade.class, props); String className = (String) props.getHeaders().get( classMapper.getClassIdFieldName()); assertThat(className, equalTo("daytrade")); }