Yeah, I think that's the way to go. It is what I used for the extended enum
functionality:

https://github.com/apache/cayenne/blob/master/cayenne/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java



On Mon, Apr 7, 2025 at 11:59 AM Nikita Timofeev <ntimof...@objectstyle.com>
wrote:

> Hello Riccardo,
>
> It should be possible to support EnumSet with ExtendedType.
> I did some prototyping, and it looks like you need to implement these
> parts:
>
> 1. an ExtendedTypeFactory as EnumSet has internal subclasses (that also
> prevents using ValueType for this):
>
> public ExtendedType getType(Class<?> objectClass) {
>   if(EnumSet.class.isAssignableFrom(objectClass)) {
>       return new EnumSetType();
>   }
>   return null;
> }
>
> 2. an ExtendedType should deal with the serialization to/from the actual
> datatype you are using in the DB:
>
> public class EnumSetType implements ExtendedType<EnumSet> {
>   @Override
>   public void setJdbcObject(PreparedStatement statement, EnumSet value, int
> pos, int type, int scale) throws Exception {
>     statement.setString(pos, toString(value));
>   }
>
>   @Override
>   public EnumSet<?> materializeObject(ResultSet rs, int index, int type)
> throws Exception {
>     return fromString(rs.getString(index));
>   }
>
>   String toString(EnumSet value) {
>     // probably should account for the Enum type
>   }
>
>   EnumSet fromString(String value) {
>   }
> }
>
> 3. and finally register factory with the runtime:
>
> ServerModule.contributeTypeFactories(binder)
>         .add(new EnumSetFactory())
>
> Hope this helps!
>
> On Sat, Apr 5, 2025 at 8:03 PM Riccardo De Menna <deme...@tuorlo.net>
> wrote:
>
> > Hello,
> >
> > I was wondering if there is a way to add a custom data type for a non
> > extendable class. Specifically I’m thinking of java.util.EnumSet.
> >
> > I often use Enums in my object classes and I occasionally employ EnumSets
> > when the case requires it. Unfortunately EnumSet is non extendable so I
> > can’t define a subclass and then use that as java type in the modeller.
> >
> > Is there a way to hack the runtime into returning an EnumSet using a
> > custom ValueType or ExtenedType for multiple attributes (it does work if
> > there’s only one attribute using EnumSet but as soon as you define two
> the
> > runtime gets confused).
> >
> > At the moment I’m just extending a HashSet<E extends Enum<E>> as a
> > workaround but every time I see that I feel guilty not being able to use
> > the ‘proper’ set collection for enums.
> >
> > Thank you,
> > Riccardo De Menna
>
>
>
> --
> Best regards,
> Nikita Timofeev
>

Reply via email to