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 >