private Converts getConverts(Element tree, XMLContext.Default defaults) { // NOTE : we use a map here to make sure that an xml and annotation referring to the same attribute // properly overrides. Bit sparse, but easy... final Map<String,Convert> convertAnnotationsMap = new HashMap<String, Convert>(); if ( tree != null ) { applyXmlDefinedConverts( tree, defaults, null, convertAnnotationsMap ); } // NOTE : per section 12.2.3.16 of the spec <convert/> is additive, although only if "metadata-complete" is not // specified in the XML if ( defaults.canUseJavaAnnotations() ) { applyPhysicalConvertAnnotations( null, convertAnnotationsMap ); } if ( !convertAnnotationsMap.isEmpty() ) { final AnnotationDescriptor groupingDescriptor = new AnnotationDescriptor( Converts.class ); groupingDescriptor.setValue( "value", convertAnnotationsMap.values().toArray( new Convert[convertAnnotationsMap.size()]) ); return AnnotationFactory.create( groupingDescriptor ); } return null; }
@SuppressWarnings("unchecked") private AttributeConverter<Object, Object> getConverter(AccessibleObject accessible) { Convert converter = accessible.getAnnotation(Convert.class); if (converter != null) { Class<?> converterClass = converter.converter(); if (!AttributeConverter.class.isAssignableFrom(converterClass)) { throw new RuntimeException( "Converter class must be AttributeConverter rather than " + converterClass.getName()); } try { Constructor<?> cs = converterClass.getDeclaredConstructor(); cs.setAccessible(true); return (AttributeConverter<Object, Object>) cs.newInstance(); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | InvocationTargetException e) { throw new RuntimeException("Cannot instantiate Converter: " + converterClass.getName(), e); } } return null; }
@SuppressWarnings("unchecked") public AttributeConversionInfo(Convert convertAnnotation, XAnnotatedElement xAnnotatedElement) { this( convertAnnotation.converter(), convertAnnotation.disableConversion(), convertAnnotation.attributeName(), xAnnotatedElement ); }
private Annotation getConvertsForAttribute(List<Element> elementsForProperty, XMLContext.Default defaults) { // NOTE : we use a map here to make sure that an xml and annotation referring to the same attribute // properly overrides. Very sparse map, yes, but easy setup. // todo : revisit this // although bear in mind that this code is no longer used in 5.0... final Map<String,Convert> convertAnnotationsMap = new HashMap<String, Convert>(); for ( Element element : elementsForProperty ) { final boolean isBasic = "basic".equals( element.getName() ); final boolean isEmbedded = "embedded".equals( element.getName() ); // todo : can be collections too final boolean canHaveConverts = isBasic || isEmbedded; if ( !canHaveConverts ) { continue; } final String attributeNamePrefix = isBasic ? null : propertyName; applyXmlDefinedConverts( element, defaults, attributeNamePrefix, convertAnnotationsMap ); } // NOTE : per section 12.2.3.16 of the spec <convert/> is additive, although only if "metadata-complete" is not // specified in the XML if ( defaults.canUseJavaAnnotations() ) { // todo : note sure how to best handle attributeNamePrefix here applyPhysicalConvertAnnotations( propertyName, convertAnnotationsMap ); } if ( !convertAnnotationsMap.isEmpty() ) { final AnnotationDescriptor groupingDescriptor = new AnnotationDescriptor( Converts.class ); groupingDescriptor.setValue( "value", convertAnnotationsMap.values().toArray( new Convert[convertAnnotationsMap.size()]) ); return AnnotationFactory.create( groupingDescriptor ); } return null; }
private void applyXmlDefinedConverts( Element containingElement, XMLContext.Default defaults, String attributeNamePrefix, Map<String,Convert> convertAnnotationsMap) { final List<Element> convertElements = containingElement.elements( "convert" ); for ( Element convertElement : convertElements ) { final AnnotationDescriptor convertAnnotationDescriptor = new AnnotationDescriptor( Convert.class ); copyStringAttribute( convertAnnotationDescriptor, convertElement, "attribute-name", false ); copyBooleanAttribute( convertAnnotationDescriptor, convertElement, "disable-conversion" ); final Attribute converterClassAttr = convertElement.attribute( "converter" ); if ( converterClassAttr != null ) { final String converterClassName = XMLContext.buildSafeClassName( converterClassAttr.getValue(), defaults ); try { final Class converterClass = ReflectHelper.classForName( converterClassName, this.getClass() ); convertAnnotationDescriptor.setValue( "converter", converterClass ); } catch (ClassNotFoundException e) { throw new AnnotationException( "Unable to find specified converter class id-class: " + converterClassName, e ); } } final Convert convertAnnotation = AnnotationFactory.create( convertAnnotationDescriptor ); final String qualifiedAttributeName = qualifyConverterAttributeName( attributeNamePrefix, convertAnnotation.attributeName() ); convertAnnotationsMap.put( qualifiedAttributeName, convertAnnotation ); } }
/** * Get searchBean * @return searchBean SearchBean. */ @Lob @Column(name = "MARSHALLED_SEARCH") @Convert(converter = SearchBeanConverter.class) public SearchBean getSearchBean() { return searchBean; }
/** * JAVADOC Method Level Comments * * @return JAVADOC. */ // @Lob @Convert(converter = JsonMapConverter.class) public Map<String, Object> getAttributes() { return attributes; }
/** * Gets the defaultValue flag on the object * @return Returns the defaultValue. */ @Convert(converter = BooleanConverter.class) @Column(columnDefinition = "CHAR(1) not null") @ProjectionColumn public Boolean getDefaultValue() { return defaultValue; }
/** * @return Returns the retired. */ @ProjectionColumn @Convert(converter = BooleanConverter.class) @Column(columnDefinition = "CHAR(1) not null") public Boolean getRetired() { return retired; }
private void applyLocalConvert( Convert convertAnnotation, XProperty collectionProperty, Map<String,AttributeConversionInfo> elementAttributeConversionInfoMap, Map<String,AttributeConversionInfo> keyAttributeConversionInfoMap) { // IMPL NOTE : the rules here are quite more lenient than what JPA says. For example, JPA says // that @Convert on a Map always needs to specify attributeName of key/value (or prefixed with // key./value. for embedded paths). However, we try to see if conversion of either is disabled // for whatever reason. For example, if the Map is annotated with @Enumerated the elements cannot // be converted so any @Convert likely meant the key, so we apply it to the key final AttributeConversionInfo info = new AttributeConversionInfo( convertAnnotation, collectionProperty ); if ( collection.isMap() ) { boolean specCompliant = StringHelper.isNotEmpty( info.getAttributeName() ) && ( info.getAttributeName().startsWith( "key" ) || info.getAttributeName().startsWith( "value" ) ); if ( !specCompliant ) { log.nonCompliantMapConversion( collection.getRole() ); } } if ( StringHelper.isEmpty( info.getAttributeName() ) ) { if ( canElementBeConverted && canKeyBeConverted ) { throw new IllegalStateException( "@Convert placed on Map attribute [" + collection.getRole() + "] must define attributeName of 'key' or 'value'" ); } else if ( canKeyBeConverted ) { keyAttributeConversionInfoMap.put( "", info ); } else if ( canElementBeConverted ) { elementAttributeConversionInfoMap.put( "", info ); } // if neither, we should not be here... } else { if ( canElementBeConverted && canKeyBeConverted ) { // specified attributeName needs to have 'key.' or 'value.' prefix if ( info.getAttributeName().startsWith( "key." ) ) { keyAttributeConversionInfoMap.put( info.getAttributeName().substring( 4 ), info ); } else if ( info.getAttributeName().startsWith( "value." ) ) { elementAttributeConversionInfoMap.put( info.getAttributeName().substring( 6 ), info ); } else { throw new IllegalStateException( "@Convert placed on Map attribute [" + collection.getRole() + "] must define attributeName of 'key' or 'value'" ); } } } }
/** * Returns the action class ({@link MCRJobAction}). * * @return the action class */ @Column(name = "action", nullable = false) @Convert(converter = MCRJobActionConverter.class) public Class<? extends MCRJobAction> getAction() { return action; }
@Override @Column @Convert(converter = MCRURIConverter.class) public URI getURI() { return super.getURI(); }
@Column(name = "COUNTRY_CODE", length = 6) @Convert(converter = CountryCodeConverter.class) public CountryCode getCountryCode() { return countryCode; }
/** * JAVADOC Method Level Comments * * @return JAVADOC. */ @Convert(converter = BooleanConverter.class) @Column(columnDefinition = "CHAR(1) not null") public boolean isComplete() { return complete; }
/** * JAVADOC Method Level Comments * * @return JAVADOC. */ @Column(length = 1000) @Convert(converter = JsonMapConverter.class) public Map<Object, Object> getProperties() { return properties; }
/** * Get is public search * * @return isPublic. */ @Convert(converter = BooleanConverter.class) @Column(name = "IS_PUBLIC", columnDefinition = "CHAR(1) not null") public boolean isPublic() { return isPublic; }
public boolean isJpaConverter() { return getEntityMethod().isAnnotationPresent(Convert.class); }
public Class<? extends Converter> getJpaConverterClass() { return getEntityMethod().getAnnotation(Convert.class).converter(); }
@Column(name = "status", nullable = false, length = 2) @Convert(converter = StatusConverter.class) public Status getStatus() { return status; }
@Column(name = "color") @Convert(converter = ColorConverter.class) public Color getColor() { return color; }
@NotNull @Convert(converter = URIConverter.class) public URI getUri() { return uri; }
@Column(name = "name", nullable = false, length = 100) @Convert(converter = NameConverter.class) public Name getName() { return name; }
@Column(name = "do-not-use", nullable = true, length = 1) @Convert(converter = GradeConverter.class) public Grade getGrade() { return grade; }
@Override @Convert(converter = MessageAttributeConverter.class) @Column(name = "message") public Message getMessage() { return this.getWrappedEvent().getMessage(); }
@Override @Convert(converter = ThrowableAttributeConverter.class) @Column(name = "exception") public Throwable getThrown() { return this.getWrappedEvent().getThrown(); }
@Override @Convert(converter = ContextMapJsonAttributeConverter.class) @Column(name = "contextMapJson") public Map<String, String> getContextMap() { return super.getContextMap(); }
/** * Gets the level. Annotated with {@code @Basic} and {@code @Enumerated(EnumType.STRING)}. * * @return the level. */ @Override @Convert(converter = LevelAttributeConverter.class) public Level getLevel() { return this.getWrappedEvent().getLevel(); }
@Override @Convert(converter = InstantAttributeConverter.class) public Instant getInstant() { return this.getWrappedEvent().getInstant(); }
@Override @Convert(converter = LevelAttributeConverter.class) @Column(name = "level") public Level getLevel() { return this.getWrappedEvent().getLevel(); }
@Override @Convert(converter = InstantAttributeConverter.class) @Column(name = "instant") public Instant getInstant() { return this.getWrappedEvent().getInstant(); }